API 21為 Activity 增加了一個(gè)新的屬性,只要將其設(shè)置成 persistAcrossReboots,activity 就有了持久化的能力,另外需要配合一個(gè)新的 bundle 才行,那就是 PersistableBundle。
這里的持久化與傳統(tǒng)意義的不同,它的具體實(shí)現(xiàn)在 Activity 重載的 onSaveInstanceState、onRestoreInstanceState 和 onCreate 方法。
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
onSaveInstanceState 和 onRestoreInstanceState 方法是一對拯救災(zāi)難的方法,它們不在“正?!暗?Activity 生命周期中,只有一些突發(fā)異常情況才會(huì)觸發(fā)它們,比如橫豎屏切換、按 Home 鍵等。當(dāng) API 21后增加了 PersistableBundle 參數(shù),令這些方法有了系統(tǒng)關(guān)機(jī)重啟后數(shù)據(jù)恢復(fù)的能力。
網(wǎng)友們評價(jià)不一,但是無論如何這都為我們提供了一種便利。而它應(yīng)用的場景是異常的狀況,不會(huì)影響我們正常的數(shù)據(jù)持久化辦法。比如在 pause 方法中做一些操作 Preferences,文件 I/O,SQLite 數(shù)據(jù)庫,ContentProvider 等常規(guī)辦法。
如何實(shí)踐呢?
只需在 Manifest 中的 activity 設(shè)置屬性:
android:persistableMode="persistAcrossReboots"
然后在 activity 中直接用上述的三個(gè)方法即可。
另外注意 API 版本是21及以上。
驗(yàn)證是個(gè)難題。因?yàn)槲覜]有5.0及以上系統(tǒng)的設(shè)備,求助與模擬器吧,各種問題都來了。無論是 Genymotion 還是自帶的模擬器,在關(guān)機(jī)的過程中模擬器都會(huì)卡死。雖然我在 log 里看到了程序已經(jīng)走過了 onSaveInstanceState(Bundle,PersistableBundle)。就差模擬器關(guān)機(jī)后開啟看效果。我這邊是沒有成功,如果哪位大蝦看到了效果,請告訴我。