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


Activity

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

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

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

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

Activity的生命周期

圖片發(fā)自簡書App

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

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

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:如果一個activity的onpause方法不結(jié)束的話,當(dāng)前的或另一個activity的onresume方法不會執(zhí)行。


Configuration Changes

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


Starting Activities and Getting Results

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

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


Process Lifecycle

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

1.foreground activity

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

2.visible activity

用戶可見但不是foreground activity,比如此時彈出了一個對話框,一般來說不會被殺掉,除非為了保證foreground activity運行。

3.background activity

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

4.empty process

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


Public method

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

添加一個可添加的布局

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

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

3.dispatchTouchEvent(MotionEvent ev)

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

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

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

5.enterPictureInPictureMode()

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

6.findViewById(int id)

從XML中解析出view對象

7.finish()

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

8.finishActivity(int requestCode)

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

9.finishAndRemoveTask()

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

10.getApplication()

獲取Activity唯一的application。如果是組件化項目不知道這個方式可不可用?

11.getCallingActivity()

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

12.getCurrentFocus()

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

13.getFragmentManager()

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

14.getIntent()

獲得啟動此Activity的intent

15.getLayoutInflater()

通過此方法直接解析一個布局成View

16.getReferrer()

誰啟動了我?

17.getParentActivityIntent()

18.getRequestedOrientation()

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

19.getSystemService(String name)

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

20.isDestroyed()

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

21.isFinishing()

調(diào)用Finish()后

22.isImmersive()

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

23.isInMultiWindowMode()

是否為多窗口模式

24.isInPictureInPictureMode()

是否為畫中畫模式

25.onAttachFragment(Fragment fragment)

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

26.onAttachedToWindow()

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

27.onBackPressed()

用戶按了返回鍵

28.onKeyDown(int keyCode, KeyEvent event)

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

29.onLowMemory()

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

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

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

31.onTouchEvent(MotionEvent event)

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

32.overridePendingTransition(int enterAnim, int exitAnim)

在startActivity(Intent) or finish()后執(zhí)行activity的切換動畫。

33.recreate()

重新創(chuàng)建一個新實例

34.releaseInstance()

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

35.runOnUiThread(Runnable action)

運行在UI線程,可在此更新一些界面顯示

36.setIntent(Intent newIntent)

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

37.setVisible(boolean visible)

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



Protected methods

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

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

2.onCreate(Bundle savedInstanceState)

3.onDestroy()

4.onNewIntent(Intent intent)

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

5.onpaues()

6.onPostCreate(Bundle savedInstanceState)

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

7.onPostResume()

在Onresume后調(diào)用

8.onUserLeaveHint()

當(dāng)用戶選擇進(jìn)入后臺時回調(diào)


Activity完

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容