singleTask 模式Activity的啓動模式之一,是一種棧內複用並activity實例唯一的一種模式。
他的特點就是棧內複用,並且會清除所在棧內自身實例上面的所有activity實例(LAUNCHER Activity除外)。
今天特此記錄,關於singleTask 模式下 Activity的跳轉傳值和使用注意事項。
一 驗證 singleTask 模式 Activity 的啓動和複用。
有四個activity
MainActivity LAUNCHER Activity 啓動模式 singleTask
AActivity 啓動模式 singleTask
BActivity 啓動模式 standard
CActivity 啓動模式 singleTask
執行順序是:MainActivity 到 AActivity 到 BActivity 到 CActivity 到 MainActivity
下方是執行日誌:
D/task: onCreate: MainActivity
D/task: onResume: MainActivity
to AActivity
D/task: onCreate: AActivity
D/task: onResume: AActivity
根據日誌我們發現,singleTask 模式的AActivity啓動時並沒有銷燬MainActivity ,因此singleTask 是無法銷燬LAUNCHER Activity的
to BActivity
D/task: onCreate: BActivity
D/task: onResume: BActivity
to CActivity
D/task: onCreate: CActivity
D/task: onResume: CActivity
to MainActivity
D/task: onDestroy: AActivity 銷燬
D/task: onDestroy: BActivity 銷燬
D/task: onRestart: MainActivity 重啓
D/task: onResume: MainActivity
D/task: onDestroy: CActivity 銷燬
MainActivity重啓時,系統銷燬了AActivity Bctivity CActivity等後續壓棧的activity實例
到此是對Activity singleTask的啓動模式下,站內複用的驗證。由此說明,singleTask模式下,
對內存的合理回收,減少創建次數和長期持有activity實例,對我們管理內存是很有好處的。
同時也也節省了初始化時間,用戶體驗也得到了提高。
二,驗證傳值問題。
重新執行一下,執行順序是 MainActivity 到 AActivity 到 MainActivity
下方是執行日誌,我們分析一下;
D/task: onCreate: MainActivity 創建
D/task: onStart: MainActivity 啓動
D/task: onResume: MainActivity 獲取焦點
D/task: onPause: MainActivity 失去焦點
toAActivity
D/task: onCreate: AActivity 創建
D/task: onResume: AActivity 獲取焦點
toMainActivity
D/task: onSaveInstanceState: MainActivity 恢復數據
D/task: onRestart: MainActivity 重啓
D/task: onStart: MainActivity 啓動
D/task: onResume: MainActivity 獲取焦點
D/task: onDestroy: AActivity 銷燬AActivity
從日誌可以看出,Activity在singleTask啓動模式下,是走複用方式的,所以不走onCreate方法,
而是走onRestart方法,但在此處並不適合進行操作,我個人喜好是這樣的,
Activity在singleTask啓動模式下的數據傳遞我是在onResume中處理接受的.
在處理單線邏輯的ui跳轉時,例如MainActivity 到 AActivity到 BActivity 到 CActivity 到 MainActivity,
需求處理完成後,又返回出發頁,這種方式的啓動模式是非常好的。需要注意是傳值問題,對內存和用戶體驗都有很好的幫助。
但要特別注意LAUNCHER屬性的Activity在singleTask啓動模式下,不要過多持有對象,因爲長期持有很容易造成內存問題。
本文完,特此記錄activity的singleTask啓動模式的特性和注意事項。