Activity的生命週期和啓動模式

Activity的生命週期
正常的activity創建的過程中會經歷如下生命週期:

  1. onCreate:表示Activity正在被創建,這是生命週期的第一個方法。在這個方法中,我們可以做一些初始化工作,比如調用setContentView去加載界面佈局資源、初始化activity中所需數據等
  2. onRestart:表示activity正在重新啓動。一般情況下,噹噹前activity從不可見重新變爲可見狀態時,onRestart就會被調用。這種情形一般是用戶行爲導致的,比如用戶按Home鍵切換到桌面或者用戶打開了一個新的Activity,這時當前的activity就會暫停,也就是onPause和onStop被執行了,接着用戶又回到了這個activity,就會出現這種情況。
  3. onStart:表示activity正在被啓動,即將開始,這時Activity已經可見了,但是還沒有出現在前臺,還無法和用戶交互。這個時候其實可以理解爲Activity已經顯現出來了,我們還看不到。
  4. onResume:表示activity已經可見了,並且出現在前臺並開始活動。要注意這個和onStart的對比,onResume時纔可以進到前臺,纔可以進行操作。
  5. onPause:表示activity正在停止,正常情況下,緊接着onStop就會被調用。在特殊的情況下,如果這個時候快速的再回到當前activity,那麼onResume就會被調用。此處可以做一些存儲數據,停止動畫等工作。
  6. onStop:表示activity即將停止,可以做一些稍微重量級的回收工作,注意不要太耗時。
  7. onDestory:表示activity即將銷燬,這是activity生命週期中最後一個回調,在這裏可以做一些回收工作和最終的資源的釋放。

放一張圖,比較清晰地看出流程脈絡
在這裏插入圖片描述
注意:如果新打開的activity採用的是透明主題,那麼當前activity的onStop方法不會被回調。
異常情況下
1.資源相關配置改變下的改變:
  onSaveInstanceState方法,發生在onStop之前;onRestoreInstanceState方法,發生在onStart之前。
2.資源內存不足導致的低優先級的activity被殺死:
  
Activity的啓動模式

  • standard:
      標準模式,也是系統默認的啓動模式。每次啓動一個activity的時候,都會重新創建一個實例,它的onCreate,onStart,onResume都會被調用一遍。
  • singleTop:棧頂複用模式。
      在這種模式下,如果新的activity已經位於任務棧的棧頂,那麼此activity不會被重新創建,同事它的onNewIntent()會被調用,通過此方法,我們可以取出我們當前請求的信息。需要指出的是:這個activity的onCreate和onStart並不會被系統調用,因爲它並未發生改變。
      如果新的activity的實例已經存在,但並沒有位於棧頂,那麼新的activity依然會被創建。
  • singleTask:棧內複用模式。
      這是一種單實例模式。只要activity再一個棧中存在,那麼多次啓動此activity都不會重新創建實例,和singTop一樣,系統會回調onNewInstance。如果啓動的activity所在的棧不處於棧頂,則會默認執行clearTop的效果,即在所啓動的activity的棧之上的棧,全部清除,並把所啓動的activity置於棧頂。
  • singleInstance:單實例模式
      這是一種加強版的singleTask,它除了具有singTask所有的特性外,還加強了一點,那就是具有此模式的activity智能單獨的位於一個任務棧中,換句話說,比如activitA是singleInstance模式的,那麼當A啓動後,系統會爲它單獨創建一個任務棧,由於棧內的複用性,後續的創建請求均不會創建新的activity,除非這個獨特的任務棧被系統銷燬了。

給activity指定啓動模式:

  1. 通過AndroidMenifest:
<activity
            android:name=".activity.MyOrderStateActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />
  1. 通過在Intent中設置標誌位:
   Intent intent = new Intent(MainActivity.this, SecondActivity.class);
   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
   startActivity(intent);
  • 優先級上:

     第二種高於第一種,兩種同時存在時,以第二種爲準。
    
  • 限定範圍:

     第一種無法直接爲activity設定爲FLAG_ACTIVITY_CLEAR_TOP標識,
     第二種無法爲activity指定singleInstance模式。
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章