APP啟動(dòng)與退出實(shí)驗(yàn)

-退出-

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末描扯,一起剝皮案震驚了整個(gè)濱河市定页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绽诚,老刑警劉巖典徊,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恩够,居然都是意外死亡卒落,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜂桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)儡毕,“玉大人,你說(shuō)我怎么就攤上這事扑媚⊙澹” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵疆股,是天一觀的道長(zhǎng)费坊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)旬痹,這世上最難降的妖魔是什么附井? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮唱凯,結(jié)果婚禮上羡忘,老公的妹妹穿的比我還像新娘谎痢。我一直安慰自己磕昼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布节猿。 她就那樣靜靜地躺著票从,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滨嘱。 梳的紋絲不亂的頭發(fā)上峰鄙,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音太雨,去河邊找鬼吟榴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囊扳,可吹牛的內(nèi)容都是我干的吩翻。 我是一名探鬼主播兜看,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狭瞎!你這毒婦竟也來(lái)了细移?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熊锭,失蹤者是張志新(化名)和其女友劉穎弧轧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碗殷,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡精绎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亿扁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺典。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖从祝,靈堂內(nèi)的尸體忽然破棺而出襟己,到底是詐尸還是另有隱情,我是刑警寧澤牍陌,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布擎浴,位于F島的核電站,受9級(jí)特大地震影響毒涧,放射性物質(zhì)發(fā)生泄漏贮预。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一契讲、第九天 我趴在偏房一處隱蔽的房頂上張望仿吞。 院中可真熱鬧,春花似錦捡偏、人聲如沸唤冈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)你虹。三九已至,卻和暖如春彤避,著一層夾襖步出監(jiān)牢的瞬間傅物,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工琉预, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留董饰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卒暂,于是被迫代替她去往敵國(guó)和親贮缅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程介却,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理谴供,服務(wù)發(fā)現(xiàn),斷路器齿坷,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 《輸贏心理學(xué)》一書桂肌,從人的心理角度去分析了輸贏問(wèn)題。主要觀點(diǎn)有3個(gè)永淌。 一是勢(shì)均力敵時(shí)崎场,競(jìng)爭(zhēng)才會(huì)有激勵(lì)作用。兒子班級(jí)...
    阿中2016閱讀 787評(píng)論 0 1
  • 【0528今日話題】 五月目標(biāo)完成得怎么樣了遂蛀? 五月目標(biāo):五月份繼續(xù)按四月份計(jì)劃進(jìn)行谭跨。1.堅(jiān)持早起2.堅(jiān)持學(xué)英語(yǔ)3...
    梓毓爸閱讀 112評(píng)論 0 0