Activity生命周期(二)異常情況
來自專欄佛戲程序猿
原文鏈接 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...
在上一篇文章 Activity生命周期之正常情況 中,分析了正常情況的生命周期的調度,除了用戶正常操作所引起的生命周期的變化外,還存在著一些異常情況,比如系統配置的改變或者內存不足的情況,這些情況下,Activity可能被殺死。
- 相關係統配置改變導致生命周期的變化典型的情況就是手機橫豎屏的變化,默認情況下,當Activity處於豎屏狀態的時候,突然旋轉屏幕,Activity會被銷毀並且重建,當然我們也可以阻止重新創建Activity(文末提供)。
默認情況下,如果Activity不做任何處理,系統配置改變後,Activity會被銷毀並重新創建。銷毀過程,Activity的
當Activity被重新創建後,系統會調用onPause
、onStop
、onDestroy
都會調用,同時由於Activity在異常情況下終止的,系統會調用onSaveInstanceState
來保存當前的Activity的狀態,這個方法在onStop
之前調用。注意 這個方法只在Activity被異常終止的情況下調用,正常情況下Activity是不會調用這個方法。onRestoreInstanceState
,並且把Activity銷毀時onSaveInstanceState
方法所保存的Bundle
對象傳遞給onRestoreInstanceState
和OnCreate
方法。因此我們可以通過onRestoreInstanceState
和OnCreate
方法來判斷Activity是否被重建了,如果是重建,就可以取出之前保存的數據並恢復。onRestoreInstanceState
調用在onStart
之後。銷毀至重建的流程:onPause
->onSaveInstanceState
->onStop
->onDestroy
->(銷毀後重建)onCreate
->onStart
->onRestoreInstanceState
->onResume
onSaveInstanceState
來保存當前的狀態,並在OnCreate
和onRestoreInstanceState
里恢複數據。舉個栗子保存數據@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);}
- 內存不足導致Activity被殺死
這種情況不好模擬,其數據存儲、恢復過程和情況1完全一致。Activity的優先順序從高到低可以大致分為一下三種:
- 前台Activity——正在和用戶交互的Activity,優先順序最高。
- 可見但非前台Activity——比如Activity中彈出了一個對話框,導致Activity可見但無法和用戶直接交互。
- 後台Activity——已經被暫停或者停止的Activity,優先順序最底。
當系統內存不足的時候,系統就會按照上述優先順序從低到高來殺死目標Activity。並在後續通過onSaveInstance和onRestoreInstance來存儲和恢複數據。
以上我們分析了系統的數據存儲和恢復機制,當然也有辦法讓系統不去重建Activity,configChanges
屬性,比如android:configChanges="orientation|screenSize"
,這種情況下,當屏幕旋轉時,Activity不會被重新創建。
歡迎關注微信號:春風十里不如認識你
http://weixin.qq.com/r/4UgRCQvEEFZvrU9q9x3z (二維碼自動識別)
推薦閱讀:
※Google 發布 "Project Treble" 來解決 Android 系統升級難
※你需要的不僅僅是一個答案
※AndroidStudio打包的apk體積比Eclipse大,如何解決?
※IT之家 · Android客戶端重設計 · 靜態解剖 · A ?
※CRefreshLayout 可自定義的下拉刷新框架