Android藝術開發探索|重點提煉一:Activity

好記性不如爛筆頭,記錄發現問題

一、正常情況下的生命週期

  • onCreate():表示Activity正在被創建
  • onRestart():表示Activity正在重新啓動
  • onStart():Activity正在被啓動,Activity可見卻還沒出現在前臺。
  • onResume():Activity已經可見,並且出現在前臺。
  • onPause():Activity正在停止。
  • onStop():Activity即將停止。
  • onDestroy():Activity即將被銷燬。

問題一:onStart和onResume、onPause和onStop的描述差不多,他們有何區別?
onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否出現在前臺的角度回調的。即onStart表示Activity可見卻還沒出現在前臺,onResume表示已經位於前臺,可以和用戶交互。onPause則表示Activity不位於前臺,但是還可見,onStop表示已經從前臺消失,不可見了。

上圖所示,正常情況下的生命週期如下:
1、第一次啓動onCreate -> onStart -> onResume.
2、用戶打開新的Activity或者切換到桌面時:onPause -> onStop。如果新的Activity爲透明時不會回調onStop。
3、用戶回到原來的Activity:onRestart -> onStart ->onResume。
4、用戶back回退時:onPause -> onStop -> onDestroy。

注:onPause中不能做重量級的操作,如耗時操作,因爲在打開新的Activity時,舊的Activity的onPause執行完,新的Activity才能onResume。

二、異常情況下的生命週期

2.1、資源相關的系統配置發生改變時導致Activity被銷燬並重建(如屏幕橫豎屏)

Activity在異常情況下被終止,系統會調用onSaveInstanceState方法(onStop被調用之前)來保存當前的狀態。保存後,Activity在被重新創建的時候,系統會調用onRestoreInstanceState(onStart被調用之後)把onSaveInstanceState所保存的Bundle對象作爲參數傳給onRestoreInstanceState和onCreate方法,那麼就可以取出之前的數據並恢復。

2.2、內存不足優先級低的Activity被銷燬

這類異常情況的數據存儲和數據恢復與上面2.1相同。Activity優先級排序:
前臺Activity > 可見但非前臺Activity > 後臺Activity

問題二:如何保證後臺工作不那麼容易被殺死?
將後臺的工作放到Service中,保證進程有一定的優先級。

問題三:如何保證Activity在系統配置發生改變後不重新創建?
給Activity指定configChanges屬性。如不想Activity在屏幕旋轉的時候重建,就可以給configChanges添加orientation屬性值。

 <activity android:name=".MainActivity"
        android:configChanges="orientation">
       <intent-filter>
            <action android:name="android.intent.action.MAIN" />
           <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

三、Activity的啓動模式

3.1、LunchMode

  • standard:標準模式,也是系統的默認模式,每次啓動Activity都會創建一個實例,不管這個實例是否存在。
  • singleTop:棧頂複用模式,第一種情況如果新的Activity位於棧頂,那麼Activity不會被重新創建,同時他的onNewIntent會被回調。第二種情況如果Activity的實例已經存在在任務棧中,但不是位於棧頂,那麼Activity還是會被重新創建。
  • singleTask:棧內複用,只要Activity在任務棧中,那麼不管啓動多少次Activity都不會被重建實例,系統也會回調onNewIntent方法。如果沒有任務棧,就先創建一個棧然後創建Activity的實例並放入棧中。如果存在任務棧,但是Activity的實例不在棧中,則需要創建實例並壓入棧中;如果Activity的實例存在,那麼就會把實例調到棧頂,並調用他的onNewIntent方法。
    另外值得注意的是,singleTask模式默認具有clearTop的效果,打個比方,當前任務棧有ABCD四個實例,A在棧底,D在棧頂,如果啓動B,會把B調到棧頂並調用onNewIntent方法,同時會導致CD全部出棧。
  • singeInstance:單實例模式,具有singleTask模式的所有特性,另外就是這種模式的Activity只能單獨的位於一個任務棧中。

3.2、主要的Flags

  • FLAG_ACTIVITY_NEW_TASK:爲Activity指定singleTask模式。
  • FLAG_ACTIVITY_SINGLE_TOP:爲Activity指定singleTop模式。
  • FLAG_ACTIVITY_CLEAR_TOP:具有此標記的Activity,當它啓動時,在同一任務棧所有位於它上面的Activity都要出棧。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個標記的Activity不會出現在歷史Activity的列表中。

推薦閱讀:
從Log中看View的事件分發機制
Android自定義View_BitmapShader實現望遠鏡效果

公衆號:小猿說,免費分享Android,Python,Java等學習視頻教程。


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