生命周期
大部分的 Android 開發都了解 activity 的生命周期,甚至倒背如流。
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestory()
根據不同的狀態可以將以上 6 個生命周期劃分不同的狀態
活動狀態 :表示 activity 顯示到前臺,位于棧頂。
暫停狀態 :表示 activity 失去焦點,但是依舊可見(棧頂 activity 非全屏,或者透明)。
停止狀態 :表示 activity 被完全覆蓋,此時 activity 不可見。
銷毀狀態 :表示 activity 被銷毀,結束生命周期。
activity 的生命周期可以參考 Android 官網給出的生命周期圖

啟動模式
一般情況下,大家都會談 Android 的四種啟動方式
standard 默認配置,新的 activity 不斷添加到當前任務棧。
singleTop 如果 activity 已經存在當前任務棧中,不會創建新的 activity 。
singleTask 如果任務棧中已經存在 activity,activity 只上的 activity 全部出棧。
singleInstance activity 單獨存在一個任務棧中
要解釋這四種啟動方式的區別,首先要先說一個概念『任務棧』。任務棧是存放 activity 的容器,擁有『棧』的『后進先出』的特性。啟動方式就是針對『任務棧』的一些操作,主要和 Android 設備上面的Home 鍵、back 建,以及 activity 對外暴露的 onBackPress() 方法有關。設置 activity 啟動方式可以有兩種途徑
1. AndroidManifest.xml 文件中 activity 標簽的 android:launchMode 屬性。
2. startActvity 時候,給 Intent 設置不同的 Flag 。
FLAG_ACTIVITY_NEW_TASK 創建新的任務棧
FLAG_ACTIVITY_SINGLE_TOP 啟動的 activity 如果處于前臺,類似 singleTop
FLAG_ACTIVITY_CLEAR_TOP 清空當前任務棧。
FLAG_ACTIVITY_NO_HISTORY activity不會入棧
查看 activity 『任務棧』的方式有以下途徑
1. 使用 adb 命令: adb shell dumpsys activity activities 。(外部查看)
2. 使用 ActivityManager 類的 getRunningTask 。(內部查看)
啟動方式引起的問題
1. 點擊 Home 按,再點擊 launcher 圖標。
會啟動一個 intent。
action = Intent.ACTION_MAIN,
category = Intent.CATEGORY_LAUNCHER
and flag = Intent.FLAG_ACTIVITY_NEW_TASK
在不同的 launchMode 組合的時候,通過 Home 鍵和 launcher 圖標可能會導致點擊返回鍵某些也無法出現。
比如三個 activity A ,B ,C 分別是 standard ,singleInstance ,singleTask 。
A->B->C->Home->launcher(c)->Back(a)->Back(桌面)
A->B->C->Back(A)->Back(B)->Back(桌面)
原因是因為在點擊 Home 鍵以后,桌面所在任務棧被提到到前面。
2. startActivityForResult 會不會被調用。
Android 5.0
1)singleInstance 調用 startActvitiy ,返回后無法執行 startActivityForResult
2)singleTask 調用 startActvitiy 、singleInstance 返回后無法執行 startActivityForResult
3) standard 、singleTop 調用 startActvitiy,返回后無法執行 startActivityForResult
Android 5.0 以后不存在以上問題。
啟動過程。
這里只討論 launcher Activity 的啟動過程,主要為了優化 app 的啟動時間做參考。
啟動方式一般分為『冷啟動』、『熱啟動』
冷啟動:應用不存在后臺,通過用戶點擊 launcher 圖標、或者被其他方式啟動。
熱啟動:應用已經存在后臺。
冷啟動
application 構造方法
application.attachBaseContext()
application.onCreate()
launcher Activity 構造方法
activity.setTheme()
activity.onCreate()
activity.onStart()
activity.onResume()
activity.onAttachToWindow()
attivity.onWindowFocusChanged()
熱啟動
launcher Activity 構造方法
activity.setTheme()
activity.onCreate()
activity.onStart()
activity.onResume()
activity.onAttachToWindow()
attivity.onWindowFocusChanged()
參考資料
使用adb shell dumpsys檢測Android的Activity任務棧
What happens when you click on an application's launch icon?