Activity生命周期
BACK鍵:
當(dāng)我們按Back鍵時(shí)调衰,我們這個(gè)應(yīng)用程序?qū)⒔Y(jié)束,這時(shí)候?qū)⑾群笳{(diào)用onPause()->onStop()->onDestory()三個(gè)方法。
再次啟動(dòng)App時(shí)应又,會(huì)執(zhí)行onCreate()->onStart()->onResume()
HOME鍵:
當(dāng)我們按HOME的時(shí)候,Activity先后執(zhí)行了onPause()->onStop()這兩個(gè)方法,
這時(shí)候應(yīng)用程序并沒(méi)有銷毀臼婆。而當(dāng)我們從桌面再次啟動(dòng)應(yīng)用程序時(shí),則先后分別執(zhí)行了onRestart()->onStart()->onResume()三個(gè)方法
注意:當(dāng)Activity在后臺(tái)時(shí)候幌绍,如果系統(tǒng)內(nèi)存不夠用颁褂,后臺(tái)的Activity很有可能會(huì)被強(qiáng)制銷毀回收內(nèi)存的,那么一定會(huì)觸發(fā)onSaveInstanceState(Bundle outState) 方法傀广,我們可以把想保存的數(shù)據(jù)保存在 outState對(duì)象里,等Activity被重新創(chuàng)建執(zhí)行onCreate(Bundle saveInstanceState) 從參數(shù)saveInstanceState再讀取保存的數(shù)據(jù)
ActivityA 打開 ActivityB
根據(jù)上圖 可以看出颁独,正常情況下依次是
- A:onPause()
- B:onCreate()
- B:onStart()
- B:onResume()
- A:onStop()
但是,如果ActivityB的樣式是Dialog樣式伪冰,B沒(méi)有完全遮擋A誓酒,ActivityB的生命周期跟剛才一樣,但是ActivityA并沒(méi)有執(zhí)行onStop()
從ActivityB 返回 ActivityA
接著上面的贮聂,如果在處于ActivityB 界面按下back鍵靠柑,返回 ActivityA,生命周期如下:
依次會(huì)執(zhí)行:
- B:onPause()
- A:onRestart()
- A:onStart()
- A:onResume()
- B:onStop()
- B:onDestory()
Activity啟動(dòng)模式
- Standard模式(默認(rèn))
每次開啟吓懈,都會(huì)在任務(wù)棧中創(chuàng)建新的Activity實(shí)例 - SingleTop模式
如果當(dāng)前待開啟的Activity正好位于棧頂歼冰,就復(fù)用,否則在任務(wù)棧中創(chuàng)建新的Activity實(shí)例 - SingleTask模式
如果當(dāng)前待開啟的Activity已經(jīng)存在耻警,無(wú)論在棧中任何位置隔嫡,都會(huì)將此位置上面的Activity全部移除,然后復(fù)用該Activity - SingleInstance模式
一個(gè)任務(wù)棧中只有一個(gè)Activity甘穿,并保證不再有其他
onNewIntent
當(dāng)Activity不是Standard模式腮恩,并且被復(fù)用的時(shí)候,會(huì)觸發(fā)onNewIntent(Intent intent) 這個(gè)方法温兼,一般用來(lái)獲取新的Intent傳遞的數(shù)據(jù)
我們一般會(huì)把MainAcitivy設(shè)置為SingleTask,除了保證MainActivity的唯一秸滴,還可以利用singleTask的特性做一些清理工作。自動(dòng)管理?xiàng)D寂校N毀無(wú)用的Acitivity.
Intent Flags
記住一點(diǎn):Activity都是運(yùn)行在任務(wù)棧里面荡含,但如果要從廣播接受者BordercastReceiver或者服務(wù)Service去啟動(dòng)一個(gè)Activity咒唆,必須為當(dāng)前Activity創(chuàng)建一個(gè)新的任務(wù)棧才能正常顯示
public class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Intent intent=new Intent(context,DemoActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//創(chuàng)建新的任務(wù)棧
context.startActivity(intent);
}