Activity啓動模式幾點需要注意的問題

本文包含內容

  1. 4中啓動模式基本介紹
  2. 項目中應用場景
  3. TaskAffinity注意事項
  4. 面試中被問的幾個問題

啓動模式

  1. standard

    • 標準啓動模式,系統默認模式
    • 每次啓動會創建一個新實例,不管這個實例是否存在
    • 誰啓動了這個Activity,那麼Activity就運行在啓動這個Activity的Activity所在的棧中
    • 如果Activity的啓動模式是SingleInstance && 任務棧不是默認的任務棧 , 那麼通過該Activity啓動Activity,會出現在默認的棧中
    • 由於非Activity類型的Context並沒有所謂的棧,所以要啓動Activity的時候爲待啓動的Activity添加FLAG_ACTIVITY_NEW_TASK標記位,這樣啓動的時候會把待啓動的Activity添加到默認的Activity棧中即名字爲包名的Activity棧。
  2. singleTop

    • 棧頂複用模式
    • 如果待啓動的Activity位於棧頂,那麼此Activity就不重新創建,會走它的onNewIntent(Bundle b)方法,該Activity的onCreate、onStart不會被系統調用。
    • 如果待啓動的Activity不位於棧頂,就會重新創建實例
  3. SingleTask

    • 棧內複用模式
    • 只要待啓動Activity在棧內存在,就不會重新創建實例,會重新走onNewIntent方法
    • clearTop效果,如果待啓動Activity上面還有其他Activity會被銷燬,讓待啓動Activity出現在棧頂的位置
  4. SingleInstance

    • 單實例模式

    • 棧內複用 + 單獨存在於一個棧中,說明:如果不和TaskAffinity結合使用,那麼該Activity還是存在默認(名字爲包名)任務棧中,如下:

        Running activities (most recent first):
        TaskRecord{407b51b8 #44 A com.example.androidreview}
        Run #3: HistoryRecord{407b4f48 com.example.androidreview/.activity.SingleInstanceActivity}
        TaskRecord{40751b30 #43 A com.example.androidreview}
        Run #2: HistoryRecord{4072cab0 com.example.androidreview/.MainActivity}
        Run #1: HistoryRecord{406624b8 com.example.androidreview/.MainActivity}
        TaskRecord{40697e80 #2 A com.android.launcher}
        Run #0: HistoryRecord{40696848 com.android.launcher/com.android.launcher2.Launcher}
      

    可見:SingleInstanceActivity和MainActivity都是在com.example.androidreview這個棧內,但是id是不同的,分別是#42,#43

應用場景

  1. standard:普通展示頁面
  2. singleTop :適用於展示通知詳情的Activity,在點開某個通知後,再點開一個通知就複用
  3. singleTask:應用主頁
  4. singleInstance:撥號、鬧鐘

TaskAffinity

  • 這個參數可以翻譯爲任務相關性。
  • 這個參數標識了一個Activity所需要的任務棧的名字
  • 默認情況下,所有Activity所需的任務棧的名字是應用的包名。
  • 我們通過爲Activity設置TaskAffinity來爲該Activity設置回退棧,不能和包名相同,否則就相當於沒指定了
  • TaskAffinity和SingleTask/SingleInstance模式或者allowTaskReparenting屬性配對使用。
  • TaskAffinity的值爲字符串,且中間必須含有包名分隔符"."
  • 指定Activity的啓動模式爲SingleInstance,但是不指定TaskAffinity,那麼該Activity還是創建在默認的Activity棧中,並不會創建新的棧
  • 在非Activity的Context中啓動Activity需要在Intent中添加FLAG_ACTIVITY_NEW_TASK,這樣啓動的Activity,默認是啓動在包名下的Activity棧中。

小夥子你知道嗎?

  1. 在非Activity的context中啓動Activity,需要怎麼做?這樣做會創建一個新的Activity棧嗎?

    添加FLAG_ACTIVITY_NEW_TASK

    會使用默認的Activity棧,即TaskAffinity爲包名的的棧

  2. 一個Activity的啓動模式爲SingleInstance,啓動它會創建一個新的Activity棧嗎

    經測試,如果指定了Activity爲SingleInstance啓動模式但是沒有設置TaskAffinity,那麼不會創建新的Activity棧,還是默認的名字爲包名的棧,但是序號是不同的,如上面介紹中看到的。如果自定義TaskAffinity,那麼會創建新的Activity棧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章