漫談 Activity

生命周期

大部分的 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()

參考資料

developer網站

使用adb shell dumpsys檢測Android的Activity任務棧

我打賭你一定沒搞明白的Activity啟動模式

Android性能優化系列之App啟動優化

What happens when you click on an application's launch icon?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容