Android實戰技巧之二十六:persistableMode與Activity的持久化,
API 21為Activity增加了一個新的屬性,只要將其設定成persistAcrossReboots,activity就有了持久化的能力,另外需要配合一個新的bundle才行,那就是PersistableBundle。
這裡的持久化與傳統意義的不同,它的具體實現在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方法是一對拯救災難的方法,它們不在“正常“的Activity生命週期中,只有一些突發異常情況才會觸發它們,比如橫豎屏切換、按Home鍵等。當API 21後增加了PersistableBundle參數,令這些方法有了系統關機重啟後資料恢複的能力。
網友們評價不一,但是無論如何這都為我們提供了一種便利。而它應用的情境是異常的狀況,不會影響我們正常的資料持久化辦法。比如在pause方法中做一些操作Preferences,檔案I/O,SQLite資料庫,ContentProvider等常規辦法。
如何實踐呢?
只需在Manifest中的activity設定屬性:
android:persistableMode="persistAcrossReboots"
然後在activity中直接用上述的三個方法即可。
另外注意API版本是21及以上。
驗證是個難題。因為我沒有5.0及以上系統的裝置,求助與模擬器吧,各種問題都來了。無論是Genymotion還是內建的模擬器,在關機的過程中模擬器都會卡死。雖然我在log裡看到了程式已經走過了onSaveInstanceState(Bundle,PersistableBundle)。就差模擬器關機後開啟看效果。我這邊是沒有成功,如果哪位大蝦看到了效果,請告訴我。