生命周期流程圖:
Activity生命周期執(zhí)行過程:
(1)啟動(dòng)Activity:系統(tǒng)會(huì)先調(diào)用onCreate()方法,然后調(diào)用onStart()方法,最后調(diào)用onResume(),Activity進(jìn)入運(yùn)行狀態(tài)。界面可顯示
(2)當(dāng)Activty被其他Activity覆蓋上(例如Activity對(duì)話框)或者被鎖屏:系統(tǒng)會(huì)調(diào)用onPause()方法,暫停當(dāng)前Activity的執(zhí)行。
(3)當(dāng)Activity由其被覆蓋狀態(tài)回到前臺(tái)或解鎖屏:系統(tǒng)會(huì)調(diào)用onResume()方法,再次進(jìn)入運(yùn)行狀態(tài)演顾。
(4)當(dāng)Activity跳轉(zhuǎn)新的頁面或者Home回到主屏供搀,自身退到后臺(tái):系統(tǒng)會(huì)先調(diào)用onPause(),然后調(diào)用onStop()方法,進(jìn)入停止?fàn)顟B(tài)钠至。
(5)當(dāng)Activity由重新被啟用或者從上個(gè)跳回:系統(tǒng)會(huì)先調(diào)用onRestart()方法葛虐,然后調(diào)用onStart()方法,最后調(diào)用onResume()方法棉钧,再次進(jìn)入運(yùn)行狀態(tài)屿脐。
(6)當(dāng)Activity處于被覆蓋狀態(tài)或者后臺(tái)不可見狀態(tài),系統(tǒng)內(nèi)存不足時(shí)宪卿,殺死當(dāng)前Activity的诵,用戶返回時(shí):再次調(diào)用onCreate()->onStart()->onResume,進(jìn)入運(yùn)行狀態(tài)
(7)當(dāng)退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause()方法佑钾,然后調(diào)用onStop()方法西疤,最后調(diào)用onDestory()方法,結(jié)束當(dāng)前Activity休溶。
除了幾個(gè)常見的方法外代赁,介紹一下onWindowFocusChanged、onSaveInstanceState邮偎、onRestoreInstanceState幾個(gè)常用方法:
(1)onWindowFocusChanged():在Activity窗口獲得或者失去焦點(diǎn)的時(shí)候被調(diào)用管跺,例如首次創(chuàng)建界面顯示時(shí)义黎,當(dāng)Activity被其他Activity覆蓋禾进,跳轉(zhuǎn)到其他Activity或者Home回到主屏,退出當(dāng)前Activity廉涕。以上情況都會(huì)被調(diào)用onWindowFocusChanged(),并且當(dāng)Activity被創(chuàng)建時(shí)是在onResume()之后調(diào)用泻云,當(dāng)Activity被覆蓋或者退出或者在后臺(tái)時(shí), 它是在onPause()之后被調(diào)用狐蜕。
(2)onSaveInstanceState():(a)在Activity被覆蓋或者退后臺(tái)之后宠纯,系統(tǒng)資源不足將其殺死,此方法會(huì)被調(diào)用层释;(b)在用戶改變屏幕方向時(shí)會(huì)被調(diào)用婆瓜;(c)在當(dāng)前Activity跳轉(zhuǎn)到其他Activity或者Home回主屏,此方法會(huì)被調(diào)用贡羔。
(3)onRestoreInstanceState():(a)在Acitivity被覆蓋或者后臺(tái)時(shí)廉白,系統(tǒng)資源不足將其殺死,然后用戶又回到了Activity乖寒,此方法會(huì)被調(diào)用猴蹂;(b)在用戶改變屏幕方向時(shí)候會(huì)被調(diào)用。我們可以重寫這個(gè)方法以便可以恢復(fù)一些臨時(shí)數(shù)據(jù)楣嘁。onRestoreInstanceState()調(diào)用是在onStart()之后磅轻。
Activity四種啟動(dòng)模式
(1)standard 標(biāo)準(zhǔn)模式
standard模式是默認(rèn)的啟動(dòng)模式珍逸,不用配置<activity>android:lauchMode屬性即可,當(dāng)然也可以制定值為standard聋溜。不管有沒有已存在的實(shí)例谆膳,都生成新的實(shí)例。如下圖撮躁,每次跳轉(zhuǎn)都會(huì)在task中生成一個(gè)新的實(shí)例摹量,并且放在棧的頂部,回退的時(shí)候看到原來的實(shí)例馒胆。
(2)singTop 棧頂復(fù)用模式
配置<activity>指定屬性為android:lauchMode="singleTop"缨称,系統(tǒng)會(huì)按照singleTop啟動(dòng)模式處理跳轉(zhuǎn)行為。如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例正位于棧頂祝迂,則重復(fù)利用睦尽,不再生成新的實(shí)例。如果另一Activity處于棧頂型雳,跳轉(zhuǎn)其時(shí)生成新的實(shí)例当凡。singleTop模式的原理如下圖所示:
(3)singleTask 棧內(nèi)復(fù)用模式
配置<activity>指定屬性為android:lauchMode="singleTask",如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例,則使此Activity實(shí)例之上的其他Activity實(shí)例統(tǒng)統(tǒng)出棧纠俭,使此Activity實(shí)例成為棧頂對(duì)象沿量,顯示到幕前。singleTask模式的原理圖如下圖所示:
(4)singleInstance 單例模式
配置<activity>指定屬性為android:lauchMode="singleInstance"? singleInstance啟動(dòng)模式比較特殊冤荆,因?yàn)樗鼤?huì)啟用一個(gè)新的棧結(jié)構(gòu)朴则,將Acitvity放置于這個(gè)新的棧結(jié)構(gòu)中,并保證不再有其他Activity實(shí)例進(jìn)入钓简。修改FirstActivity的launchMode="standard"乌妒,SecondActivity的launchMode="singleInstance",我們發(fā)現(xiàn)這兩個(gè)Activity實(shí)例分別被放置在不同的棧結(jié)構(gòu)中外邓,關(guān)于singleInstance的原理圖如下:
如果我們修改FirstActivity的launchMode值為singleTop撤蚊、singleTask、singleInstance中的任意一個(gè)损话,流程將會(huì)如圖所示:
singleInstance啟動(dòng)模式可能是最復(fù)雜的一種模式侦啸,為了幫助大家理解,我舉一個(gè)例子丧枪,假如我們有一個(gè)share應(yīng)用光涂,其中的ShareActivity是入口Activity,也是可供其他應(yīng)用調(diào)用的Activity豪诲,我們把這個(gè)Activity的啟動(dòng)模式設(shè)置為singleInstance顶捷,然后在其他應(yīng)用中調(diào)用。我們編輯ShareActivity的配置:
<activity android:name=".ShareActivity" android:launchMode="singleInstance">
? ? ? ? ? ? <intent-filter>
? ? ? ? ? ? ? ? <action android:name="android.intent.action.MAIN" />
? ? ? ? ? ? ? ? <category android:name="android.intent.category.LAUNCHER" />
? ? ? ? ? ? </intent-filter>
? ? ? ? ? ? <intent-filter>
? ? ? ? ? ? <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" />
? ? ? ? ? ? ? ? <category android:name="android.intent.category.DEFAULT" />
? ? ? ? ? ? </intent-filter>
? ? ? ? </activity>
然后我們?cè)谄渌麘?yīng)用中這樣啟動(dòng)該Activity:
Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE");
startActivity(intent);
當(dāng)我們打開ShareActivity后再按后退鍵回到原來界面時(shí)屎篱,ShareActivity做為一個(gè)獨(dú)立的個(gè)體存在服赎,如果這時(shí)我們打開share應(yīng)用葵蒂,無需創(chuàng)建新的ShareActivity實(shí)例即可看到結(jié)果,因?yàn)橄到y(tǒng)會(huì)自動(dòng)查找重虑,存在則直接利用践付。大家可以在ShareActivity中打印一下taskId,看看效果缺厉。關(guān)于這個(gè)過程永高,原理圖如下:
Activity啟動(dòng)模式的設(shè)置
啟動(dòng)模式設(shè)置有兩種方法:在mainifest中設(shè)置、通過Intent設(shè)置標(biāo)志提针。
(1)<activity
android:launchMode="standard"/>? standard 標(biāo)準(zhǔn)模式? singleTop 棧頂模式 singleTask 棧內(nèi)復(fù)用模式? singleInstance 單例模式命爬。
(2)通過Intent設(shè)置標(biāo)志
Intent inten=new Intent(ActivityA.this,ActivityB.class);??
Intent.addFlags(Intent.FlAG_ACTIVITY_NEW_TASK);?
?startActivity(intent);
標(biāo)記位屬性及含義
FLAG_ACTIVITY_SINGLE_TOP? ? ? ? ? ?指定啟動(dòng)模式為棧頂復(fù)用模式singleTop;
FLAG_ACTIVITY_NEW_TASK? ? ? ? ? ? ? 指定啟動(dòng)模式為棧內(nèi)復(fù)用模式singleTask辐脖;
FLAG_ACTIVITY_CLEAT_TOP? ? ? ? ? ? ?所有位于其上層的Activity都要移除饲宛,singleTask類似
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS? ? ?具有該標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Acitivity的列表中,即無法通過歷史列表返回到該Activity上嗜价。
兩種設(shè)置方法的區(qū)別:優(yōu)先級(jí)不同? intent>manifest設(shè)置方式? ? ? 限定范圍不同? ? ?manifest設(shè)置方式無法設(shè)定FLAG_ACTIVITY_CLEAR_TOP;Intent設(shè)置方式無法設(shè)置單例模式singleInstance艇抠;