面試題 之 『 Activity啓動模式 』

終於撇開噁心的業務代碼,有時間來複習下android知識了,筆者也屬於那種,間歇性雄心鬥志,持續性混吃等死,的人,天天加班幹到深夜,都 ™ 沒時間學習,複習一些知識了,本篇文章也是一種記錄,一種備忘,要是一不當心幫助到了別人,想必也是極好的,筆者知識有限,也在學習,不免紕漏,萬望海涵,請指正,行,廢話就到這兒吧!android


Activity啓動模式:

什麼? 朕的大秦滅亡啦? 你™ 還在講這種垃圾知識點?面試

冷靜下大兄弟

這種知識點,你們都知道,可是面試,尤爲是那種中小型公司問一些基礎時,冷不丁給你問一句,4種啓動模式,雖然都差很少,但有些細微的差異,很容易搞混淆,徹底能夠不用細究,直接收藏保存,之後想看的時候過一遍就行。筆者也是,總是記不住(也不必記),須要的時候翻出來看看就行。這也是我記錄的緣由。shell

Standard模式:

這是最普通,系統默認的啓動方式,通常咱們開發若是沒有特殊需求這種模式是使用的最多的,startActivity的時候Activity依次入棧,按下返回鍵 後進先出 依次回退。相似於這樣:學習

standard模式

這裏給你們推薦一個 ADB 命令能夠直接查看到Activity的堆棧信息:adb shell dumpsys activitygoogle

這個時候咱們能夠看見,只有一個Activity棧,棧中的Activity排列,以及頂部的Activity(FourthActivity)
Standard模式堆棧信息spa


SingleTop模式:

該模式和standard模式只有一點點區別:

  • 該Activity在棧頂:.net

    • 若是該Activity就在棧頂, 那麼再次startActivity的時候,並不會再開一個Activity而是,直接從新走該Activity的onNewInstance方法!code

  • 該Activity不在棧頂:xml

    • 由其餘Activity去startActivity 該Activity,那麼走的仍是standard模式的規則blog

    就像這樣:

SingleTop模式

這裏面的A_Activity就是singleTop啓動模式,且咱們能夠從先後兩個堆棧信息裏面看到Activity的狀況:

這裏咱們有4個Activity 分別爲A、B、C、D,其中B爲SingleTop模式,

  • 正常狀況:A->B->C-D
    singleTop正常狀況

singleInstance模式:

  • 棧頂再次啓動本身:A->B->B:
    正常狀況SingleTop

這個時候,不會在去啓動新的B,而是直接走了onNewIntent方法。

SingleInstance模式:

該模式下的Activity會被 放入一個新的棧中,而且 該棧中,僅只有該Activity。
就像這樣:

  • A啓動B發現B沒有實例,直接開闢新棧並將其放入。
  • B在啓動C,發現C是標準啓動模式,將B放入標準模式的棧中。
  • C、D、A、啓動B,發現已經存在新棧中,這時候B會被呈現給用戶,而且回調onNewIntent方法。
  • 標準棧中,依次回退,直到沒有Activity以後,纔會回到B所在的棧中。

singleInstance模式

經過ADB命令查看:

singleInstance的堆棧信息

SingleTask模式:

SingleTask模式

  • 該模式下的Activity會被放入一個新棧中,且處於棧底。
  • 該模式下的Activity再次啓動別的Activity會被放入當前棧。
  • 該模式下的Activity啓動本身,會走onNewIntent
  • 該棧中的其餘Activity啓動singleTask模式的Activity,其Acitivity上面的全部Activity會被清理掉。

若是使用過該模式的同窗應該都遇到過坑,直接設置Androidmanifest.xml文件中的launchMode以後啓動發現並非在一個新的棧中:
singleTask坑
什麼狀況? 不是在一個新的棧中嗎? 其實經過源碼研究,在ActivityStack中會對被啓動的Activity的taskAffinity進行判斷所形成的,對於想深刻研究的請移步singleTask之謎。,對於這個問題google官方也有一些說明。該模式不適合大多數應用。

既然這樣, 咱們給被啓動的Activity加上屬性taskAffinity相似於這樣:

<activity
    android:name=".B_Activity"
    android:launchMode="singleInstance"
    android:taskAffinity="cn.lxw.activitylaunchersequenceB"
    />

完成以後再來看看堆棧信息:
singleTask堆棧信息

相關文章
相關標籤/搜索