兩個onCreate方法?你真的了解onCreate()么?


  Activity的onCreate方法一直是我們編寫一個activity最先重載的方法。細心的小伙伴在編寫代碼的時候回看到這樣一幕:

咦,這里怎么會有兩個onCreate提供給我們重載?選擇困難症患者表示根本選不出來。WTF?長久的經驗告訴我們,我們要重載的是第一個onCreate方法,他只有一個參數也一直只有一個參數。並且用protected進行約束。

**兩個方法有什么區別?

  我們知道onCreate 是Activity生命周期的第一個方法。我們通常會在onCreate中做一些View初始化,等等操作。onCreate在整個生命周期只會初始化一次外,他還有一個很重要的作用:當我們的Activity非正常銷毀之后,

例如手機旋轉,內存不足導致的后台自動銷銷毀。為了保護我們的數據可以將數據保存在savedInstanceState中,當Activity重啟數據依舊不會消失。我們可以通過onCreate方法中的savedInstance參數拿到我們的數據。

做法很簡單只要重載onSaveInstanceState或者onRestoreInstance就可以了:

  

 
         
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
 
        

將數據以鍵值對的形式傳入,方法提供一個Bundle類型的outState參數暫存數據。之后再onCreate中取出,保證Activity銷毀但是數據不銷毀。真是簡單實用的功能解決了大多數手機內存不足而用戶前台數據丟失的痛點。

   onCreate方法以及足夠強大,但是他能否更加強大?有沒有這樣一種情況,手機由於過熱,沒電或者第三方定制Rom由於卡頓而異常關機的情況?當用戶在操作前台數據的時候手機突然關機了,怎么辦?下面介紹onCreate的第二個方法

@Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

沒錯,當你的手機異常關機,他能幫你找回之前前台的數據。他實際上是一種數據持久化的Activity。哇塞,真牛逼。那么我們應該怎么樣使用呢?

首先,我們需要在Android 的清單文件的Activity中指定如下屬性:

android:persistableMode="persistAcrossReboots"

接着重載onSaveInstanceState或者onRestoreInstance:

 @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
 

他們對應着一個PersistableBundle類型的persistentState。對齊進行操作就OK了。

補充:上面說到重載onSaveInstanceState或者onRestoreInstance。這里解釋一下這兩個方法onSaveInstanceState調用時機是當前Activity即將被銷毀而還未被銷毀的時候。而當系統調用了onRestoreInstance就表示這個Activity已經被銷毀了。這個可以看需求

進行調用,這里補充一下知識點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM