Android的Activity生命週期以及四種啓動模式

Activity生命週期

1、Activity一生中有七種不同的狀態。
  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()
  • 【備註:】
    A、七個生命週期組合:
    • onCreate、onStart、onResume:啓動應用程序
    • onPause、onStop:失去焦點
    • onRestart、onStart、onResume:重新獲得焦點
    • onPause、onStop、onDestroy :退出應用程序
    B、七個生命週期按階段劃分:
    • onCreate() --- onDestroy()            完整生命週期    The entire lifetime
    • onStart() --- onStop()                    可見生命週期     The visible lifetime:
    • onResume() --- onPause()            前沿生命週期(焦點生命週期)    The foreground lifetime:




【橫豎屏切換時的生命週期問題的解決】
(一)、android:configChanges屬性
對android:configChanges屬性,一般認爲有以下幾點:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
但是,自從Android 3.2(API 13),在設置Activity的android:configChanges="orientation|keyboardHidden"後,還是一樣 會重新調用各個生命週期的。因爲screen size也開始跟着設備的橫豎切換而改變。所以,在AndroidManifest.xml裏設置的MiniSdkVersion和 TargetSdkVersion屬性大於等於13的情況下,如果你想阻止程序在運行時重新加載Activity,除了設置"orientation", 你還必須設置"ScreenSize"。
解決方法:
AndroidManifest.xml中設置android:configChanges="orientation|screenSize


Activity啓動模式
   在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啓動模式決定了Activity的啓動運行方式。Android總Activity的啓動模式分爲四種:
(一)、Activity啓動模式設置:
        <activity android:name=".MainActivity" android:launchMode="standard" />

(二)、Activity的四種啓動模式:

    1. standard(備註:standard是系統默認的啓動模式。)

        標準啓動模式,每次激活Activity時都會創建Activity,並放入任務棧中。每個窗體的getTaskId()保持不變,但是this.hashCode()發生改變。


  2. singleTop

        如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity對象,不過它會調用onNewIntent()方法。如果棧頂部不存在就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。會回調onNewIntent()方法。


  3. singleTask

        如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。 

        和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求創建的,而singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢測到的我們需要的Activity置爲棧頂。


  4. singleInstance

        與singleTask模式的區別是存放singleInstance模式窗口對象的回退棧不能有其他任何窗口對象。因此如果該窗口不存在,則要新建任務來存放該singleInstance模式窗口。也就是說getTaskId()會發現任務id發生了變化。

        此啓動模式和我們使用的瀏覽器工作原理類似,在多個程序中訪問瀏覽器時,如果當前瀏覽器沒有打開,則打開瀏覽器,否則會在當前打開的瀏覽器中訪問。此模式會節省大量的系統資源,因爲他能保證要請求的Activity對象在當前的棧中只存在一個。


 總之,在開發Android項目時,巧妙設置Activity的啓動模式會節省系統開銷和提高程序運行效率。同時提升用戶的UI體驗,對應用程序的推廣是非常有好處的,畢竟一個用戶體驗很差的應用,是很難得到用戶推廣的。



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