本人目前4年開發(fā)經(jīng)驗,奈何還是一個菜鳥宽气,之前一直沒有更新過随常,現(xiàn)在想著寫一些東西,挖掘一下自己的大腦萄涯,用來當(dāng)作日記绪氛,記錄一下自己這些年來的工作經(jīng)驗
一.生命周期與啟動模式????????
如果單純的談生命周期來講,想必對于android開發(fā)來說涝影,再簡單不過枣察,如下圖
如果加上啟動模式 ,可能生命周期會有一些變化燃逻,啟動模式包括四種??
1.標(biāo)準(zhǔn)模式 -standard? ? 在清單文件中聲明序目,如果未聲明,默認(rèn)也是這種模式伯襟,即每次啟動標(biāo)準(zhǔn)模式的activit都會重新創(chuàng)建一個新的實例猿涨,不管任務(wù)棧中是否存在,都會重新創(chuàng)建姆怪,并且每個新的實例都會調(diào)用完整的生命周期叛赚。誰啟動了這個Activity,那么這個Activity實例就運行在啟動它的那個Activity所在的棧中?稽揭。根據(jù)上面所說红伦,我們就了解了當(dāng)用ApplicationContext啟動或者在Service中直接調(diào)用startActivity啟動標(biāo)準(zhǔn)模式Activity時報如下錯誤的原因了。
android.util.AndroidRuntimeException: Calling startActivity?from?outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is?this?really what you want?
上面錯誤的原因就是被啟動的Activity是標(biāo)準(zhǔn)模式淀衣,而發(fā)起啟動請求的Context不是Activity的Context昙读,未存在Activity棧,而每個Activity實例啟動銷毀都需要進(jìn)棧出棧膨桥,用棧來存儲Activity的信息蛮浑,所以非Activity Context需要設(shè)置FLAG_ACTIVITY_NEW_TASK屬性,啟動一個新的Activity棧只嚣。
2.? ?棧頂復(fù)用模式-sing top:在這種模式下沮稚,如果新啟動的Activity已經(jīng)位于任務(wù)戰(zhàn)的棧頂,那么此Activity不會被重新創(chuàng)建册舞,只會重新調(diào)用?onNewIntent?方法蕴掏,這個Activity的onCreate、onStart都不會被系統(tǒng)調(diào)用。如果新Activity實例已經(jīng)存在但不在棧頂盛杰,那么重新創(chuàng)建 Activity 并放入棧頂挽荡。
3.棧內(nèi)復(fù)用-singTask:也叫單例模式,一個棧中只允許存在同樣activity的一種實例即供,無論是否在棧頂定拟,只要存在,就不會重新創(chuàng)建實例逗嫡,和singtop一樣青自,也會調(diào)用onNewIntent方法
需要注意的是:如果一個Activity被設(shè)置為singleTask模式,那么當(dāng)棧內(nèi)已經(jīng)存在該Activity實例時驱证,再啟動該Activity延窜,會讓該Activity實例之上的Activity被出棧。舉個例子:有四個Activity 分別是 A抹锄、B逆瑞、C和D,A是singleTask模式,當(dāng)先執(zhí)行A->B->C->D時祈远,A在棧內(nèi)已存在實例呆万,此時再調(diào)用D->A啟動A時,會讓A實例之上的B车份、C谋减、D都出棧。一般項目的MainActivity都設(shè)置為此模式扫沼,方便放回首頁和清空中間Activity出爹。
4.單實例模式-singleInstance:這是一種加強的singleTask模式,它除了具有singleTask模式的所有特性外缎除,還加強了一點严就,那就是此種模式的Activity只能單獨地位于一個任務(wù)棧中,不同的應(yīng)用去打開這個activity 共享公用的同一個activity器罐。他會運行在自己單獨梢为,獨立的任務(wù)棧里面,并且任務(wù)棧里面只有他一個實例存在轰坊。應(yīng)用場景:呼叫來電界面铸董。這種模式的使用情況比較罕見,在Launcher中可能使用肴沫∷诤Γ或者你確定你需要使Activity只有一個實例。