Activity官方直譯深入理解(完結(jié))


Activity

一個(gè)Activity是用戶(hù)可以直觀交互的東西。所有的activity都聚焦于創(chuàng)建一個(gè)窗口,可以通過(guò)setcontentview(view)的方式。通常情況下一個(gè)activity是全屏顯示的,當(dāng)然也可以設(shè)置不同的theme來(lái)顯示不同的風(fēng)格,例如windowIsFloating來(lái)設(shè)置浮動(dòng)窗口。以下是每個(gè)activity必須回調(diào)的方法:

Oncreate 在此你可以初始化你的activity。通常情況下你會(huì)用布局文件setcontentview的方式來(lái)定義此activity。在程序中通過(guò)findViewById(int)來(lái)和布局中的控件進(jìn)行交互。

Onpause 當(dāng)用戶(hù)離開(kāi)你的activity時(shí)會(huì)回調(diào)此方法,通常情況下之前用戶(hù)做的改變行為需在此提交。

在用Context.startActivity()啟動(dòng)之前,需要在AndroidManifest.xml通過(guò)<activity>聲明。

Activity的生命周期

圖片發(fā)自簡(jiǎn)書(shū)App

整個(gè)過(guò)程從Oncreate開(kāi)始,ondestroy結(jié)束。用戶(hù)可以見(jiàn)到activity時(shí)刻從onstart開(kāi)始到onstop之前。我們可以在onstart里面注冊(cè)BroadcastReceiver,以便收到廣播后修改我們的ui, 在onstop里面取消我們的BroadcastReceiver。用戶(hù)可以和activity交互的時(shí)候從onresume開(kāi)始直到onpause,一個(gè)activity會(huì)經(jīng)常在這兩個(gè)生命周期切換,所以最好在這兩個(gè)方法里做輕量級(jí)的操作。

你應(yīng)該在你的子類(lèi)中回調(diào)如下方法,以便在不同的時(shí)候處理不同的邏輯。

public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}

Note:如果一個(gè)activity的onpause方法不結(jié)束的話(huà),當(dāng)前的或另一個(gè)activity的onresume方法不會(huì)執(zhí)行。


Configuration Changes

屏幕翻轉(zhuǎn),改變語(yǔ)言或者輸入設(shè)備的改變,都會(huì)導(dǎo)致activity銷(xiāo)毀。當(dāng)然,我們可以在manifest.xml里面聲明android:configChanges屬性,在上述配置改變的時(shí)候交給我們自己的activity處理.將回調(diào)在這個(gè)方法里onConfigurationChanged(Configuration),如果在此方法中有些屏幕配置的改變沒(méi)有處理到,那么activity還是會(huì)被銷(xiāo)毀,如果是當(dāng)前在棧頂?shù)腶ctivity則會(huì)重建。


Starting Activities and Getting Results

通常情況下我們用startActivity(Intent)來(lái)啟動(dòng)一個(gè)新的activity,但有時(shí)我們想從新的activity結(jié)束的時(shí)候獲取某些數(shù)據(jù)。比如微信打開(kāi)相冊(cè)選擇某個(gè)圖片發(fā)給聯(lián)系人。此時(shí)就要用到startActivityForResult(Intent, int),int為請(qǐng)求碼,將在稍后介紹。返回的結(jié)果將回調(diào)在原activity的onActivityResult(int, int, Intent)方法里。不同的int表示不同的情況,如結(jié)果返回成功與否。Android系統(tǒng)已幫我們做了定義(RESULT_CANCELED, RESULT_OK)。下面請(qǐng)看示例:見(jiàn)諒,實(shí)在不知道怎么在手機(jī)上調(diào)代碼的格式

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startActivityForResult(
new Intent(Intent.ACTION_PICK,
new Uri("content://contacts")),
PICK_CONTACT_REQUEST);
return true;
}
return false;
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// A contact was picked. Here we will just display it
// to the user.
startActivity(new Intent(Intent.ACTION_VIEW, data));
}
}
}


Permissions

啟動(dòng)一個(gè)Activity可能被拒絕,當(dāng)在manifest里面沒(méi)聲明對(duì)應(yīng)權(quán)限的時(shí)候。任何一個(gè)權(quán)限的生命周期(6.0需要特別的權(quán)限處理,百度android6.0權(quán)限封裝)將持續(xù)到整個(gè)activity結(jié)束。


Process Lifecycle

Android系統(tǒng)會(huì)盡可能長(zhǎng)的保留我們的應(yīng)用進(jìn)程,但是當(dāng)內(nèi)存不足的時(shí)候會(huì)移除最老的進(jìn)程。通常情況下移除進(jìn)程會(huì)和用戶(hù)交互的activity類(lèi)型有很大相關(guān),以下列出了四種activity的類(lèi)型(重要性從高到低):

1.foreground activity

用戶(hù)正在交互的Activity,如你現(xiàn)在正在瀏覽的簡(jiǎn)書(shū)。它的進(jìn)程只有在內(nèi)存超出預(yù)期(由手機(jī)設(shè)備分配)才會(huì)被殺掉,通常來(lái)講設(shè)備有責(zé)任保留它的進(jìn)程。

2.visible activity

用戶(hù)可見(jiàn)但不是foreground activity,比如此時(shí)彈出了一個(gè)對(duì)話(huà)框,一般來(lái)說(shuō)不會(huì)被殺掉,除非為了保證foreground activity運(yùn)行。

3.background activity

系統(tǒng)為前兩種Activity預(yù)留內(nèi)存會(huì)將此activity安全的殺掉。當(dāng)用戶(hù)重新返回這個(gè)activity時(shí),oncreate方法會(huì)被回調(diào),并會(huì)在onSaveInstanceState(Bundle)方法保存退出前的狀態(tài)。

4.empty process

不再持有Activity或者是一個(gè)Service or BroadcastReceiver,系統(tǒng)在內(nèi)存不足時(shí)有極大的可能性殺掉,所以我們?cè)谟胹ervice這種后臺(tái)服務(wù)的時(shí)候,需要告訴系統(tǒng)我們的進(jìn)程需要保留(通常做法是設(shè)置前臺(tái)進(jìn)程,彈出notification)。


Public method

1.addContentView(View view, ViewGroup.LayoutParams param)

添加一個(gè)可添加的布局

2.createPendingResult(int requestCode, Intent data, int flags)

創(chuàng)建一個(gè)PendingIntent的對(duì)象,并將處理結(jié)果返回到onActivityResult(int, int, Intent)。

3.dispatchTouchEvent(MotionEvent ev)

此方法在處理滑動(dòng)沖突時(shí)極為有用,還有一個(gè)在子類(lèi)中常用的方法view.getparent.requestdisallow(true)誰(shuí)用誰(shuí)知道。事件分發(fā)在很多大牛的文章已經(jīng)有講述了,小弟就不獻(xiàn)丑了。

4.dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args)

打印Activity的狀態(tài)到指定流

5.enterPictureInPictureMode()

讓此Activity進(jìn)入畫(huà)中畫(huà)模式,如果系統(tǒng)允許的話(huà)。現(xiàn)在主流直播可能就是此方法的衍生。

6.findViewById(int id)

從XML中解析出view對(duì)象

7.finish()

結(jié)束當(dāng)前Activity,有人說(shuō)此方法是不正常的結(jié)束方式,但看官方并無(wú)特別說(shuō)明。

8.finishActivity(int requestCode)

強(qiáng)制關(guān)閉通過(guò)startActivityForResult(Intent, int)啟動(dòng)的activity。

9.finishAndRemoveTask()

結(jié)束一個(gè)Task里所有的activity。喲,難道能在主頁(yè)調(diào)這個(gè)方法?

10.getApplication()

獲取Activity唯一的application。如果是組件化項(xiàng)目不知道這個(gè)方式可不可用?

11.getCallingActivity()

超級(jí)有用的方法,通常我們做開(kāi)發(fā)的,不知道當(dāng)前頁(yè)面是哪個(gè)activity,我們可以繼承一個(gè)baseactivity,然后再回調(diào)oncreate的時(shí)候打印出當(dāng)前的類(lèi)名,這樣我們就可以知道哪個(gè)頁(yè)面對(duì)應(yīng)哪個(gè)activity了。關(guān)于這個(gè)郭大神有一篇這個(gè)文章,后面我會(huì)貼出代碼。

12.getCurrentFocus()

獲得當(dāng)前Window聚焦的具體view

13.getFragmentManager()

返回和當(dāng)前Activity綁定的fragment的fragment manager

14.getIntent()

獲得啟動(dòng)此Activity的intent

15.getLayoutInflater()

通過(guò)此方法直接解析一個(gè)布局成View

16.getReferrer()

誰(shuí)啟動(dòng)了我?

17.getParentActivityIntent()

18.getRequestedOrientation()

當(dāng)前請(qǐng)求的屏幕方向,注意用詞,請(qǐng)求的,可能沒(méi)請(qǐng)求成功

19.getSystemService(String name)

根據(jù)名字獲得不同系統(tǒng)級(jí)的服務(wù)

20.isDestroyed()

回調(diào)的Ondestroy執(zhí)行了,表示當(dāng)前activity的實(shí)例已經(jīng)死了

21.isFinishing()

調(diào)用Finish()后

22.isImmersive()

是否為沉侵模式,并且不能被通知打斷

23.isInMultiWindowMode()

是否為多窗口模式

24.isInPictureInPictureMode()

是否為畫(huà)中畫(huà)模式

25.onAttachFragment(Fragment fragment)

回調(diào)此方法在Fragment.onAttach()后

26.onAttachedToWindow()

當(dāng)前Activity的主window是否關(guān)聯(lián)上了windowmanager

27.onBackPressed()

用戶(hù)按了返回鍵

28.onKeyDown(int keyCode, KeyEvent event)

當(dāng)有鍵被按下的時(shí)候,同時(shí)所有的子view沒(méi)有處理的情況會(huì)回調(diào)

29.onLowMemory()

內(nèi)存不足時(shí)回調(diào),可在此釋放一些資源,降低被系統(tǒng)回收的概率

30.onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

請(qǐng)求的所有權(quán)限回調(diào)

31.onTouchEvent(MotionEvent event)

觸摸事件,當(dāng)子view沒(méi)做處理的時(shí)候

32.overridePendingTransition(int enterAnim, int exitAnim)

在startActivity(Intent) or finish()后執(zhí)行activity的切換動(dòng)畫(huà)。

33.recreate()

重新創(chuàng)建一個(gè)新實(shí)例

34.releaseInstance()

通知本地App叫它釋放內(nèi)存

35.runOnUiThread(Runnable action)

運(yùn)行在UI線(xiàn)程,可在此更新一些界面顯示

36.setIntent(Intent newIntent)

更新回調(diào)的getintent()

37.setVisible(boolean visible)

當(dāng)前主Window是否可見(jiàn)

Protected methods

1.onActivityResult(int requestCode, int resultCode, Intent data)

接收啟動(dòng)的Activity結(jié)束時(shí)返回給它的一系列參數(shù)

2.onCreate(Bundle savedInstanceState)

3.onDestroy()

4.onNewIntent(Intent intent)

當(dāng)啟動(dòng)模式為singleTop,在調(diào)用startActivity(Intent)時(shí)回調(diào)此方法

5.onpaues()

6.onPostCreate(Bundle savedInstanceState)

在onStart() and onRestoreInstanceState(Bundle)后調(diào)用,此方法用的少,但存在基友它的道理

7.onPostResume()

在Onresume后調(diào)用

8.onUserLeaveHint()

當(dāng)用戶(hù)選擇進(jìn)入后臺(tái)時(shí)回調(diào)


Activity完結(jié),以后將開(kāi)始service的直譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容