一、概述
onRestoreInstanceState方法是在Activity經歷了某些事件,例如,橫豎屏切換或因內存不足而被銷毀後,系統會在Activity重建時調用此方法。因此,使用onRestoreInstanceState能夠在Activity銷毀後恢復之前保存的用戶狀態信息。
二、onRestoreInstanceState簡介
onRestoreInstanceState方法的調用時機是在onStart方法之後,onResume方法之前,所以它不應該被用於恢復運行時的數據,而是用於恢復保存的實例狀態。此外,在onRestoreInstanceState方法中需要先調用super.onRestoreInstanceState(savedInstanceState)方法,以保證Activity的默認狀態能夠正常恢復。
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // Do something to restore state }
三、如何使用onRestoreInstanceState
使用Bundle保存和恢復狀態
在onSaveInstanceState方法中,可以使用Bundle保存所有需要恢復的狀態信息,並在onRestoreInstanceState中恢復。
@Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("key", value); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); int value = savedInstanceState.getInt("key"); // Do something to restore state }
通過putXXX方法,可以將各種類型的值保存到Bundle中,例如,putString、putInt、putBoolean等方法。通過getXXX方法,在恢復時能夠準確地獲取對應的值,以便正確恢復。
使用Parcelable來保存和恢復狀態
Parcelable是一種Android獨有的序列化方式,它比Serializable更高效,因為它只序列化了對象的實際內容,而不需要包含額外的信息。
如果需要保存和恢復自定義的對象,可以讓這些對象實現Parcelable接口,然後將它們保存到Bundle中,就可以在onRestoreInstanceState中恢復。
public class CustomObject implements Parcelable { private String name; private int age; protected CustomObject(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator CREATOR = new Creator() { @Override public CustomObject createFromParcel(Parcel in) { return new CustomObject(in); } @Override public CustomObject[] newArray(int size) { return new CustomObject[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } } @Override protected void onSaveInstanceState(Bundle outState) { CustomObject obj = new CustomObject("name", 20); outState.putParcelable("key", obj); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); CustomObject obj = savedInstanceState.getParcelable("key"); // Do something to restore state }
四、什麼情況下會調用onRestoreInstanceState
除了上文提到的橫豎屏切換或因內存不足而被銷毀後的重建之外,在以下場景下也可能會調用onRestoreInstanceState:
- 當用戶通過任務管理器將應用處於後台的Activity強制關閉時,系統會在用戶回到該Activity時調用onRestoreInstanceState。
- 當應用處於後台時,如果系統將應用進程殺死了,而用戶再次打開應用時,系統也會重建Activity並調用onRestoreInstanceState。
五、注意事項
- onRestoreInstanceState只有在恢復Activity的時候才會被調用。如果你的Activity沒有被銷毀並重新創建,這個方法將不會執行。
- 在Activity的生命周期中,onSaveInstanceState方法則是在onPause之前調用。
- Bundle保存的數據是有限制的,不同設備不同情況下存儲空間也不同,因此應該注意及時清理Bundle中不必要的數據。
原創文章,作者:WXEZM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/324943.html