Activity生命周期(二)異常情況

Activity生命周期(二)異常情況

來自專欄佛戲程序猿

原文鏈接 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...

在上一篇文章 Activity生命周期之正常情況 中,分析了正常情況的生命周期的調度,除了用戶正常操作所引起的生命周期的變化外,還存在著一些異常情況,比如系統配置的改變或者內存不足的情況,這些情況下,Activity可能被殺死。

  1. 相關係統配置改變導致生命周期的變化

    典型的情況就是手機橫豎屏的變化,默認情況下,當Activity處於豎屏狀態的時候,突然旋轉屏幕,Activity會被銷毀並且重建,當然我們也可以阻止重新創建Activity(文末提供)。

    默認情況下,如果Activity不做任何處理,系統配置改變後,Activity會被銷毀並重新創建。銷毀過程,Activity的onPauseonStoponDestroy都會調用,同時由於Activity在異常情況下終止的,系統會調用onSaveInstanceState來保存當前的Activity的狀態,這個方法在onStop之前調用。注意 這個方法只在Activity被異常終止的情況下調用,正常情況下Activity是不會調用這個方法。

    當Activity被重新創建後,系統會調用onRestoreInstanceState,並且把Activity銷毀時onSaveInstanceState方法所保存的Bundle對象傳遞給onRestoreInstanceStateOnCreate方法。因此我們可以通過onRestoreInstanceStateOnCreate方法來判斷Activity是否被重建了,如果是重建,就可以取出之前保存的數據並恢復。onRestoreInstanceState調用在onStart之後。

    銷毀至重建的流程:onPause->onSaveInstanceState->onStop->onDestroy->(銷毀後重建)onCreate->onStart->onRestoreInstanceState->onResume

同時,異常情況下終止,會調用onSaveInstanceState來保存當前的狀態,並在OnCreateonRestoreInstanceState里恢複數據。

舉個栗子

保存數據@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("test","保存的數據"); Log.i("》》》A"," onSaveInstanceState 開始保存數據");}獲取數據@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState != null){ String data = savedInstanceState.getString("test"); Log.i("》》》A"," onCreate 獲取的數據:"+data); }}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String data = savedInstanceState.getString("test"); Log.i("》》》A"," onRestoreInstanceState 獲取的數據:"+data);}

  1. 內存不足導致Activity被殺死

    這種情況不好模擬,其數據存儲、恢復過程和情況1完全一致。Activity的優先順序從高到低可以大致分為一下三種:

    1. 前台Activity——正在和用戶交互的Activity,優先順序最高。
    2. 可見但非前台Activity——比如Activity中彈出了一個對話框,導致Activity可見但無法和用戶直接交互。
    3. 後台Activity——已經被暫停或者停止的Activity,優先順序最底。

當系統內存不足的時候,系統就會按照上述優先順序從低到高來殺死目標Activity。並在後續通過onSaveInstance和onRestoreInstance來存儲和恢複數據。

以上我們分析了系統的數據存儲和恢復機制,當然也有辦法讓系統不去重建Activity,configChanges屬性,比如android:configChanges="orientation|screenSize",這種情況下,當屏幕旋轉時,Activity不會被重新創建。

至此,關於Activity在正常情況和異常情況下的生命周期介紹結束了,對Activity的生命周期應該也有了深入的了解了。

歡迎關注我的博客:https://blog.manjiexiang.cn/

歡迎關注微信號:春風十里不如認識你

weixin.qq.com/r/4UgRCQv (二維碼自動識別)


推薦閱讀:

Google 發布 "Project Treble" 來解決 Android 系統升級難
你需要的不僅僅是一個答案
AndroidStudio打包的apk體積比Eclipse大,如何解決?
IT之家 · Android客戶端重設計 · 靜態解剖 · A ?
CRefreshLayout 可自定義的下拉刷新框架

TAG:Android | Android開發 |