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