Android Activity 詳解
生命週期
如上圖所示,Activity生命週期很簡單共七個生命週期函式,oncreate(),onrestart(),onstart(),onresume(),onpause(),onstop(),ondestroy();
下面舉兩個例子來說明Activity生命週期函式呼叫關係。A Activity 開啟 B Activity ,B佔滿螢幕,返回A。A Activity 開啟 C Activity,C未佔滿螢幕,返回A。
(1)、B佔滿螢幕,A獲取不到任何焦點
Action | A Activity | B Activity |
---|---|---|
Open A | onCreate()=>onStart()=>onResume() | - |
Open B | onPause()=>B=>onStop() | onCreate()=>onStart()=>onResume() |
Return A | onRestart()=>onStart()=>onResume() | onPause()=>A=>onStop()=>onDestroy() |
(2)、B未佔滿螢幕,A還能獲取到焦點
Action | A Activity | B Activity |
---|---|---|
Open A | onCreate()=>onStart()=>onResume() | - |
Open B | onPause()=>B | onCreate()=>onStart()=>onResume() |
Return A | onResume() | onPause()=>A=>onStop()=>onDestroy() |
啟動模式
Activity有四種啟動模式,分別是standard,singleTop,singleTask,singleInstance。這四種啟動模式將決定啟動一系列Activity後,後退棧內的Activity的結構。
1、standard (預設啟動模式)
這種啟動模式,每啟動一個Activity,便將這個Activity例項壓入棧位於棧的頂端。
2、singleTop
這種模式,如果要啟動的Activity例項已經存在於棧的頂端,系統會呼叫onNewIntent()方法,而不是在例項化一個Activity物件。如果要啟動的Activity不在棧頂,則要重新建立。
3、singleTask
這種模式,若要啟動的Activity在當前棧內,系統會呼叫onNewIntent()方法,而不是重新建立例項,此Activity上的其他例項都彈出棧,此Activity將位於棧頂。
4、singleInstance
這種模式,如果應用1的任務棧中建立了MainActivity例項,如果應用2也要啟用MainActivity,則不需要建立,兩應用共享該Activity例項。
關閉多個Activity
一、將Activity啟動模式修改為singleTask
將某個Activity啟動模式設定為singleTask模式,返回這個頁面時,系統會關閉這個Activity之上的所有Activity。
二、程式維護Activity集合
使用ListView或者Stack等,每次開啟新的Activity時,將引用存入到這個集合中,需要關閉的時候依次關閉Activity。
三、使用onActivityResult()遞迴關閉
在onActivityResult中接收上一個Activity的資料,關閉自身,再將資料傳遞下去。
四、通過BroadcastReceiver,關閉Activity
每個Activity中註冊廣播接收者,需要關閉應用的時候,傳送廣播,接收到廣播關閉自身。(PS:此方法慎用)