聲明 :禁止轉(zhuǎn)載,禁止商業(yè)化
Activity概述
Activity 是一個(gè)應(yīng)用組件。用戶可與提供的屏幕進(jìn)行交互。
每個(gè) Activity 都會(huì)獲得一個(gè)用于繪制其用戶界面的窗口。窗口通常會(huì)充滿屏幕,但也可小于屏幕并浮動(dòng)在其他窗口之上。
Activity是一個(gè)典型的模板設(shè)計(jì)模式。你只需要在相應(yīng)的回調(diào)方法中寫你的業(yè)務(wù)邏輯就好了。
需要掌握的內(nèi)容:
- Activity的生命周期。
- 任務(wù) 和 返回棧
- IntentFilter的相關(guān)匹配規(guī)則
1. Activity的生命周期
onCreate();
onReStart();
onStart(); Activity 已經(jīng)創(chuàng)立完成,且是可見(jiàn)的,但是此時(shí)Activity并沒(méi)有在前臺(tái)
onResume(); Activity 在前臺(tái)。
onPause()
onStop();
onDestroy();
一般的上面的生命周期都是成對(duì)的出現(xiàn)的。
但是請(qǐng)注意:
onStart/onStop是Activity可見(jiàn)的
onResume/onPause() 是Activity 在前臺(tái)的。
onCreate/onDestroy 是Activity 創(chuàng)建和銷毀的。
那么注意到 onReStart 是干嘛的呢?就是調(diào)用了 onStop,但是這個(gè)Activity又可見(jiàn)的時(shí)候調(diào)用。
問(wèn)題一 onStart 和 onResume 到底有什么區(qū)別?
這個(gè)問(wèn)題
2. Activity的啟動(dòng)
一共就二種方式:
- startActivity
- startActivityForResult
3. Activity的結(jié)束
- finish。
- finishActivity 結(jié)束您之前啟動(dòng)的另一個(gè) Activity。
4. 狀態(tài)保存
概述
當(dāng)Activity被銷毀的時(shí)候,Activity對(duì)象被銷毀了,那么Activity中的狀態(tài)呢?
二個(gè)回調(diào)函數(shù):
- onSaveInstanceState()
- onRestoreInstanceSate();
注:由于無(wú)法保證系統(tǒng)會(huì)調(diào)用 onSaveInstanceState(),因此您只應(yīng)利用它來(lái)記錄 Activity 的瞬態(tài)(UI 的狀態(tài))— 切勿使用它來(lái)存儲(chǔ)持久性數(shù)據(jù),而應(yīng)使用 onPause() 在用戶離開(kāi) Activity 后存儲(chǔ)持久性數(shù)據(jù)(例如應(yīng)保存到數(shù)據(jù)庫(kù)的數(shù)據(jù))。
不過(guò),即使您什么都不做,也不實(shí)現(xiàn) onSaveInstanceState(),Activity 類的 onSaveInstanceState() 默認(rèn)實(shí)現(xiàn)也會(huì)恢復(fù)部分 Activity 狀態(tài)。具體地講,默認(rèn)實(shí)現(xiàn)會(huì)為布局中的每個(gè) View 調(diào)用相應(yīng)的 onSaveInstanceState() 方法,讓每個(gè)視圖都能提供有關(guān)自身的應(yīng)保存信息。Android 框架中幾乎每個(gè)小部件都會(huì)根據(jù)需要實(shí)現(xiàn)此方法,以便在重建 Activity 時(shí)自動(dòng)保存和恢復(fù)對(duì) UI 所做的任何可見(jiàn)更改。例如,EditText 小部件保存用戶輸入的任何文本,CheckBox 小部件保存復(fù)選框的選中或未選中狀態(tài)。您只需為想要保存其狀態(tài)的每個(gè)小部件提供一個(gè)唯一的 ID(通過(guò) android:id 屬性)。如果小部件沒(méi)有 ID,則系統(tǒng)無(wú)法保存其狀態(tài)。
也就是說(shuō),對(duì)于View的狀態(tài),你可以不用關(guān)心,但是對(duì)于 Activity中的一些成員變量,需要你去保存狀態(tài)。
onSaveInstanceState調(diào)用時(shí)機(jī)
- 在onStop 之前。
- 可能在onPause之前,也可能在onPause之后,沒(méi)有一個(gè)明確的時(shí)機(jī)。
onRestoreInstanceState時(shí)機(jī)
- 在onStart之后。
特別注意
onRestoreInstanceState 和 onSaveInstanceState只是Activity生命周期發(fā)生異常的時(shí)候調(diào)用,這個(gè)怎么理解?比如系統(tǒng)內(nèi)存不足回收Activity,或者Activity的橫豎屏切換的時(shí)候,這個(gè)時(shí)候就會(huì)被調(diào)用。
對(duì)于Activity 的橫豎屏切換時(shí)的生命周期和狀態(tài)的保存問(wèn)題。
5.協(xié)調(diào)Activity
如果 ActivityA 啟動(dòng)ActivityB 的時(shí)候,過(guò)程是怎么樣的呢?
- Activity A 的 onPause() 方法執(zhí)行。
- Activity B 的 onCreate()、onStart() 和 onResume() 方法依次執(zhí)行。(Activity B 現(xiàn)在具有用戶焦點(diǎn)。)
- 然后,如果 Activity A 在屏幕上不再可見(jiàn),則其 onStop() 方法執(zhí)行。
任務(wù)(task) 和 返回棧(back stack)
任務(wù)和返回棧是二個(gè)不同的概念,也就是說(shuō)不是同一個(gè)東西。沒(méi)有搞清楚任務(wù)和返回棧這些概念,那么是無(wú)法弄懂關(guān)于 Activity啟動(dòng)模式等一系列的問(wèn)題的。
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack), in the order in which each activity is opened.
上面是官網(wǎng)關(guān)于 task 和 stack的相關(guān)概念說(shuō)明。
task :為了某個(gè)工作的一系列的 activity 集合。
stack : 可以理解為activity 的排列順序。
一個(gè)task 中有一個(gè)或者多個(gè)Activity,一個(gè)stack 中有一個(gè)或者多個(gè) task。
下圖通過(guò) adb shell dumpsys activity 命令得到某個(gè)stack 和 task的相關(guān)信息。

可以看出 stack #5 下面有二個(gè) task
分別是:task #89 和 task #90;
其中 task #89 里面有二個(gè) Activity,分別是 ThirdActivity 和 MainActivity。另一個(gè)任務(wù)棧中只有一個(gè)Activity ,即 SecondActivity。
接下來(lái)的幾個(gè)屬性:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
請(qǐng)認(rèn)真弄懂上面的幾個(gè)屬性。特別注意:
taskAffinity 和 singleTask , singleTask一起使用的時(shí)候,需要進(jìn)行多次的測(cè)試。 這個(gè)不是一兩句話可以描述清楚的。
都是針對(duì) task來(lái)說(shuō)的,不是針對(duì) stack 來(lái)說(shuō)的。所以很多的博客,包括很多的書寫的都有問(wèn)題的。他們把task 和 stack 混為一談,所以盡信書,不如無(wú)書,多多實(shí)踐,只要有疑問(wèn),那么就是獲得新知識(shí)的開(kāi)始。
Activity的啟動(dòng)模式
這個(gè)是需要深入討論的問(wèn)題。
Standard
singleTop
singleTask
系統(tǒng)創(chuàng)建新任務(wù)并實(shí)例化位于新任務(wù)底部的 Activity。但是,如果該 Activity 的一個(gè)實(shí)例已存在于一個(gè)單獨(dú)的任務(wù)中,則系統(tǒng)會(huì)通過(guò)調(diào)用現(xiàn)有實(shí)例的 onNewIntent() 方法向其傳送 Intent,而不是創(chuàng)建新實(shí)例。一次只能存在 Activity 的一個(gè)實(shí)例。
注:盡管 Activity 在新任務(wù)中啟動(dòng),但是用戶按“返回”按鈕仍會(huì)返回到前一個(gè) Activity。
singleInstance
與 "singleTask" 相同,只是系統(tǒng)不會(huì)將任何其他 Activity 啟動(dòng)到包含實(shí)例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動(dòng)的任何 Activity 均在單獨(dú)的任務(wù)中打開(kāi)。
關(guān)于 TaskAffinity 任務(wù)相關(guān)性
這 TaskAffinity 和 singleTask 或者 allowTaskReparenting一起使用,不然就沒(méi)有什么意義。
對(duì)于 TaskAffinity ,對(duì)于沒(méi)有 聲明的,這個(gè)Activity ,Service等會(huì)繼承Application的。