正常生命周期
來看看最正常的Activity的啟動流程:
-
啟動MainActivity時調(diào)用如下:
-
這時啟動SecondActivity,調(diào)用如下:
- 再次返回MainActivity
看到這個結(jié)果時,發(fā)現(xiàn)MainActivity的 onPause() 的方法優(yōu)先于SecondActivity的 onCreate() 锌妻。也就是說新界面啟動的時候,舊界面會先將 onPause() 執(zhí)行完畢蛇数,所以為了不影響新界面的啟動,最好不要在 onPause() 中有過多的操作夹界。
官方文檔中也說戈次,不要在 onPause() 有重量級操作轩勘。
異常生命周期
1. 屏幕旋轉(zhuǎn)
- 觀察日志,當(dāng)屏幕旋轉(zhuǎn)的時候怯邪,Activity會先將自己銷毀掉绊寻。然后重新創(chuàng)建這個Activity。
- 在銷毀過程中悬秉,會調(diào)用Activity的 onSaveInstanceState() 方法澄步,可以在這里存儲一些數(shù)據(jù)。
- 在重建的過程中和泌,會調(diào)用Activity的 onRestoreInstanceState() 方法村缸。做一些數(shù)據(jù)的重新賦值。
- onSaveInstanceState() 這個方法是在 onStop() 之前執(zhí)行武氓,和onPause() 沒有先后關(guān)系梯皿,既可能在onPause()之前,也可能在onPause()之后聋丝。
- onRestoreInstanceState() 方法是在onStart() 之后執(zhí)行索烹。
onSaveInstanceState() 執(zhí)行的時間:
- 點擊home鍵回到主頁或長按后選擇運行其他程序
- 按下電源鍵關(guān)閉屏幕
- 啟動新的Activity
- 橫豎屏切換時,肯定會執(zhí)行
旋轉(zhuǎn)屏幕弱睦,禁止重新創(chuàng)建Activity:
Android可以為不同的尺寸和橫豎屏配置不同資源百姓。
所以當(dāng)Android切換了橫豎屏的時候,需要加載不同的資源况木。
這時就必須使用新的資源重新創(chuàng)建Activity垒拢。
如果你不想讓Activity重新創(chuàng)建,可以在 AndroidManifest.xml 中配置Activity火惊。
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize" />
然后當(dāng)屏幕旋轉(zhuǎn)的時候求类,只會調(diào)用Activity的 onConfigurationChanged() 方法。
2. 內(nèi)存不足導(dǎo)致改變
當(dāng)系統(tǒng)的內(nèi)存不足的時候屹耐,系統(tǒng)會按照Activity的優(yōu)先級去殺死所在的進程尸疆。
進程的優(yōu)先級如下:
- 前臺進程:正在交互的界面
- 可見進程:可見但不是前臺界面(前臺界面是透明主題等等)
- 服務(wù)進程:不屬于以上兩種,但是包含服務(wù)的進程
- 后臺進程:一個最普通的Activity按下了Home鍵惶岭,會導(dǎo)致onStop()方法執(zhí)行寿弱,就會變成后臺進程
- 空進程:不屬于以上種類,就是這類了按灶。
內(nèi)存不足時候引發(fā)的系統(tǒng)將進程殺死症革,如果這個進程是包含Activity,那么這個Activity的數(shù)據(jù)的存儲和恢復(fù)都和上面的流程是一致的鸯旁,都是調(diào)用 onSaveInstanceState() 和 onRestoreInstanceState() 方法來存儲和恢復(fù)數(shù)據(jù)噪矛。
所以一個進程上沒有包含四大組件量蕊,是很容易被系統(tǒng)殺死的。
所以后臺數(shù)據(jù)處理最好使用Service去進行艇挨,以保證一定的優(yōu)先級残炮。
3. Activity持久化存儲
這是 API 21 以后,才有的新特性缩滨。
新增了三個方法吉殃,每個方法都多了一個參數(shù) PersistableBundle:
onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
文檔對 PersistableBundle 的描述:是一個鍵值對的集合,可以安全的將數(shù)據(jù)存儲到磁盤并從磁盤恢復(fù)楷怒。
所以實現(xiàn)這幾個方法,程序會具有系統(tǒng)關(guān)機重啟后數(shù)據(jù)恢復(fù)的能力瓦灶。
想要使得這三個方法被調(diào)用鸠删,必須在AndroidManifest.xml 中做配置:
<activity
android:name=".MainActivity"
android:persistableMode="persistAcrossReboots" />
我在一開始使用AS寫代碼時候,經(jīng)常會寫錯方法贼陶,發(fā)現(xiàn)明明實現(xiàn)了onCreate()刃泡,界面上卻是空白的。
仔細一看才發(fā)現(xiàn)復(fù)寫的onCreate()是兩個參數(shù)的方法碉怔。
所以一定要注意烘贴,** 默認情況下這兩個參數(shù)的 onCreate() 是不會被調(diào)用的**,如果寫錯了撮胧,界面上會是空白桨踪,并且不會報錯。
但是這個功能我實驗了很多次芹啥,但是 并沒有成功锻离。也不知是使用的方法不對還是手機的原因。所以有哪個大神對于這個有正確使用方法墓怀,麻煩告知我一下汽纠。