-退出-
function exit_1:
Intent intent = new Intent(MainAct.this,StartAct.class);//跳轉(zhuǎn)到root activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清除root activity之上的所有activity
intent.putExtra(StartAct.FLAG, StartAct.FLAG_EXIT);//帶過(guò)去一個(gè)標(biāo)志,在root activity中接收到這個(gè)標(biāo)志時(shí)绊诲,就finish掉root activity
startActivity(intent);
function exit_2:
moveTaskToBack(boolean nonRoot);//當(dāng)nonRoot=flase時(shí)邪铲,如果當(dāng)前activity不是root activity旷坦,則無(wú)任何效果
function exit_3:
finishAndRemoveTask();//從SDK21才有這個(gè)方法砸狞。
兩者異同:
都可以保留進(jìn)程阳似。
exit_1闷堡,Task中沒(méi)有activity了隘膘,在recent task中會(huì)顯示黑屏截圖,再次啟動(dòng)應(yīng)用會(huì)從root activity開(kāi)始啟動(dòng)杠览。
exit_2弯菊,Task中保留activity,在recent task中會(huì)顯示棧頂activity截圖踱阿,再次啟動(dòng)應(yīng)用會(huì)把Task移到前臺(tái)管钳。
從體驗(yàn)上來(lái)說(shuō),exit_2更好一點(diǎn)软舌,再次啟動(dòng)速度更快蹋嵌。但也意味著占用更多資源。不過(guò)支付寶葫隙、QQ什么的貌似都這么做栽烂。
-啟動(dòng)-
這里主要涉及到“初始化操作放在哪里”、“如何保存全局變量”恋脚、“APP在后臺(tái)被回收后再次啟動(dòng)”三個(gè)問(wèn)題腺办。
function launch_1:
初始化操作放在自定義Application的onCreate方法中。
這樣做帶來(lái)的問(wèn)題是糟描,隨著項(xiàng)目增長(zhǎng)怀喉,引入的第三方庫(kù)越來(lái)越多,一般第三方庫(kù)都會(huì)要求在Application的onCreate方法中初始化船响,當(dāng)初始化操作比較耗時(shí)的時(shí)候躬拢,每次啟動(dòng)都會(huì)黑屏一段時(shí)間躲履,這實(shí)際上是Application的onCreate方法正在執(zhí)行,root activity的onReusme還未執(zhí)行造成的聊闯。
為了減少黑屏?xí)r間工猜,嘗試function launch_2:
放在root activity的onCreate方法中,所謂啟動(dòng)頁(yè)菱蔬。一般來(lái)說(shuō)篷帅,全局變量都由初始化操作賦值。全局變量保存在Application中拴泌,而初始化操作在root activity的onCreate方法中魏身。當(dāng)用戶按HOME鍵或采用exit_2退出時(shí),Task會(huì)移動(dòng)到后臺(tái)蚪腐。當(dāng)Task因內(nèi)存緊張而被系統(tǒng)回收時(shí)箭昵,全局變量也被回收且沒(méi)有默認(rèn)的保存方法。
當(dāng)再次啟動(dòng)APP時(shí)回季,注意這里有一個(gè)天坑<抑啤!茧跋!
如果在Manifests文件中設(shè)置application標(biāo)簽
android:theme="@android:style/Theme.Translucent.XXXX"
那么會(huì)恢復(fù)重建原來(lái)所有的Activity,重建次序是從棧頂數(shù)第二個(gè)Activity到root activity卓囚,最后是棧頂?shù)腁ctivity瘾杭。
如果設(shè)置
android:theme="@android:style/Theme.Black.XXXX"
那么會(huì)只重建原來(lái)?xiàng)m數(shù)腁ctivity,當(dāng)按下Back鍵哪亿,從棧頂數(shù)第二個(gè)Activity被推到棧頂粥烁,這個(gè)Activity才會(huì)重建。
也就是說(shuō)蝇棉,為了給全局變量重新賦值(不然就NullPoint了)讨阻,必須設(shè)置成Translucent。
然后換一種思路篡殷,嘗試function launch_3:
當(dāng)Task在后臺(tái)被回收后钝吮,再次啟動(dòng)==重啟APP。
為了達(dá)到這一目的板辽,需要這樣做:
設(shè)置一個(gè)標(biāo)志代表全局變量的狀態(tài)奇瘦,如果全局變量是未經(jīng)過(guò)初始化的,那么除了root activity外所有activity都不應(yīng)該被建立劲弦,如果系統(tǒng)想恢復(fù)它們耳标,我們就主動(dòng)finish掉。最后Task中只剩root activity沒(méi)有被finish邑跪,正常執(zhí)行完onCreate后跳轉(zhuǎn)到新建的main activity次坡『糁恚看起來(lái)就像重啟一樣。
這樣做的問(wèn)題是砸琅,finish只有等onCreate方法執(zhí)行完才會(huì)起作用宋距,所以如果在onCreate方法中調(diào)用finish之后讀取全局變量,仍然會(huì)報(bào)NullPoint明棍。另外乡革,如果有用到Fragment,事情就變得異常復(fù)雜了摊腋。
嘗試持久化處理沸版,function launch_4:
對(duì)全局變量持久化處理,或者在new的時(shí)候賦初始值兴蒸。
這樣做的問(wèn)題是:持久化處理會(huì)留下臟數(shù)據(jù)视粮;初始值不是異步更新的最新數(shù)據(jù)。
-額外的-
一些APP會(huì)通過(guò)設(shè)置Theme來(lái)提升體驗(yàn)橙凳。
設(shè)置android:theme="@android:style/Theme.Translucent.NoTitleBar"蕾殴,原來(lái)的黑屏變?yōu)橥该鳎?br> 設(shè)置android:theme="@android:style/Theme.Light.NoTitleBar",原來(lái)的黑屏變?yōu)榘灼粒?br> 他們的區(qū)別在初次啟動(dòng)時(shí)最容易觀察到岛啸,比如優(yōu)酷初次啟動(dòng)會(huì)在桌面卡2秒钓觉,就是第一種;知乎初次啟動(dòng)會(huì)白屏2秒坚踩,就是第二種荡灾;聯(lián)通客戶端初次啟動(dòng)會(huì)黑屏2秒,就是默認(rèn)的黑屏瞬铸。
如果進(jìn)程中有一些服務(wù)批幌,那么服務(wù)啟動(dòng)的時(shí)候會(huì)執(zhí)行Application的onCreate。
//To do ……
alwaysRetainTaskState = true或flase沒(méi)有區(qū)別
網(wǎng)上說(shuō)在root activity設(shè)置為false嗓节,被系統(tǒng)殺死后只保留root activity荧缘;設(shè)置為true,則保留全部activity拦宣。但是我試了試截粗,在這方面沒(méi)有任何區(qū)別。
-Log- function launch_2 Translucent
----正常啟動(dòng)
Application--onCreate
root activity--onCreate
root activity--onStart
main activity--onCreate
main activity--onStart
secondary activity--onCreate
secondary activity--onStart
----Home鍵大約10s后
root activity--onStop
main activity--onStop
secondary activity--onStop
----360一鍵清理鸵隧,或內(nèi)存不足而被回收
Process--DEAD
查詢Task信息桐愉,root activity、main activity掰派、secondary activity都為DETROYED
----有守護(hù)進(jìn)程从诲,自動(dòng)重啟
Application--onCreate
查詢Task信息,root activity靡羡、main activity系洛、secondary activity仍為DETROYED
----再次啟動(dòng)APP
main activity--onCreate
main activity--onStart
root activity--onCreate
root activity--onStart
secondary activity--onCreate
secondary activity--onStart
secondary activity--onStop
secondary activity--onDestroy
為了secondary activity不destroy俊性,可以在root activity加判斷:如果saveInstanceState != null則不跳轉(zhuǎn)到main activity。