本文包含內容
- 4中啓動模式基本介紹
- 項目中應用場景
- TaskAffinity注意事項
- 面試中被問的幾個問題
啓動模式
-
standard
- 標準啓動模式,系統默認模式
- 每次啓動會創建一個新實例,不管這個實例是否存在
- 誰啓動了這個Activity,那麼Activity就運行在啓動這個Activity的Activity所在的棧中
- 如果Activity的啓動模式是SingleInstance && 任務棧不是默認的任務棧 , 那麼通過該Activity啓動Activity,會出現在默認的棧中
- 由於非Activity類型的Context並沒有所謂的棧,所以要啓動Activity的時候爲待啓動的Activity添加FLAG_ACTIVITY_NEW_TASK標記位,這樣啓動的時候會把待啓動的Activity添加到默認的Activity棧中即名字爲包名的Activity棧。
-
singleTop
- 棧頂複用模式
- 如果待啓動的Activity位於棧頂,那麼此Activity就不重新創建,會走它的onNewIntent(Bundle b)方法,該Activity的onCreate、onStart不會被系統調用。
- 如果待啓動的Activity不位於棧頂,就會重新創建實例
-
SingleTask
- 棧內複用模式
- 只要待啓動Activity在棧內存在,就不會重新創建實例,會重新走onNewIntent方法
- clearTop效果,如果待啓動Activity上面還有其他Activity會被銷燬,讓待啓動Activity出現在棧頂的位置
-
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
-
應用場景
- standard:普通展示頁面
- singleTop :適用於展示通知詳情的Activity,在點開某個通知後,再點開一個通知就複用
- singleTask:應用主頁
- 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棧中。
小夥子你知道嗎?
-
在非Activity的context中啓動Activity,需要怎麼做?這樣做會創建一個新的Activity棧嗎?
添加FLAG_ACTIVITY_NEW_TASK
會使用默認的Activity棧,即TaskAffinity爲包名的的棧
-
一個Activity的啓動模式爲SingleInstance,啓動它會創建一個新的Activity棧嗎
經測試,如果指定了Activity爲SingleInstance啓動模式但是沒有設置TaskAffinity,那麼不會創建新的Activity棧,還是默認的名字爲包名的棧,但是序號是不同的,如上面介紹中看到的。如果自定義TaskAffinity,那麼會創建新的Activity棧。