終於撇開噁心的業務代碼,有時間來複習下android知識了,筆者也屬於那種,間歇性雄心鬥志,持續性混吃等死,的人,天天加班幹到深夜,都 ™ 沒時間學習,複習一些知識了,本篇文章也是一種記錄,一種備忘,要是一不當心幫助到了別人,想必也是極好的,筆者知識有限,也在學習,不免紕漏,萬望海涵,請指正,行,廢話就到這兒吧!android
什麼? 朕的大秦滅亡啦? 你™ 還在講這種垃圾知識點?面試
這種知識點,你們都知道,可是面試,尤爲是那種中小型公司問一些基礎時,冷不丁給你問一句,4種啓動模式,雖然都差很少,但有些細微的差異,很容易搞混淆,徹底能夠不用細究,直接收藏保存,之後想看的時候過一遍就行。筆者也是,總是記不住(也不必記),須要的時候翻出來看看就行。這也是我記錄的緣由。shell
這是最普通,系統默認的啓動方式,通常咱們開發若是沒有特殊需求這種模式是使用的最多的,startActivity
的時候Activity依次入棧,按下返回鍵 後進先出 依次回退。相似於這樣:學習
這裏給你們推薦一個 ADB 命令能夠直接查看到Activity的堆棧信息:adb shell dumpsys activity
google
這個時候咱們能夠看見,只有一個Activity棧,棧中的Activity排列,以及頂部的
Activity(FourthActivity)
:spa
該模式和
standard
模式只有一點點區別:
該Activity在棧頂:.net
若是該Activity就在棧頂, 那麼再次
startActivity
的時候,並不會再開一個Activity而是,直接從新走該Activity的onNewInstance
方法!code
該Activity不在棧頂:xml
由其餘Activity去
startActivity
該Activity,那麼走的仍是standard
模式的規則blog
就像這樣:
這裏面的A_Activity
就是singleTop
啓動模式,且咱們能夠從先後兩個堆棧信息裏面看到Activity的狀況:
這裏咱們有4個Activity 分別爲A、B、C、D,其中B爲SingleTop模式,
這個時候,不會在去啓動新的B,而是直接走了onNewIntent
方法。
該模式下的Activity會被 放入一個新的棧中,而且 該棧中,僅只有該Activity。
就像這樣:
經過ADB命令查看:
onNewIntent
。若是使用過該模式的同窗應該都遇到過坑,直接設置Androidmanifest.xml文件中的
launchMode
以後啓動發現並非在一個新的棧中:
什麼狀況? 不是在一個新的棧中嗎? 其實經過源碼研究,在ActivityStack
中會對被啓動的Activity的taskAffinity進行判斷所形成的,對於想深刻研究的請移步singleTask之謎。,對於這個問題google官方也有一些說明。該模式不適合大多數應用。
既然這樣, 咱們給被啓動的Activity加上屬性taskAffinity相似於這樣:
<activity android:name=".B_Activity" android:launchMode="singleInstance" android:taskAffinity="cn.lxw.activitylaunchersequenceB" />
完成以後再來看看堆棧信息: