很小白的问题,但是还是记录一下吧。顺便分析一下:
大家都知道Activity的onCreate方法有两个重写,如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
空白原因:
我们重写了第二个onCreate方法就会造成页面空白。具体原因分析如下:
这个方法的重写是为了采用PersistableBundle进行数据持久化处理,而要使这个方法能用必须在Manifest里面注册Activity的时候添加
android:persistableMode=“persistAcrossReboots”
借大佬的一张图来解释下android:persistableMode这个属性的具体值吧:
//当设备重启时,任务栈中的根Activity和其上的设置了此项的Activity都会对数据进行保存。
//当设备重启后启动对应的Activity时能够对数据进行恢复。
android:persistableMode="persistAcrossReboots"
// 不使用持久化功能,只有根Activity设置此值才有效果——
//不调用onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState)这个方法
android:persistableMode="persistNever"
//默认值。当设备重启时,任务栈中的根Activity会进行持久化处理。只有根Activity设置此值才有效果。
android:persistableMode="persistRootonly"
数据持久化具体实现:
- 配置Manifest文件中activity:
<activity android:name=".MainActivity"
android:persistableMode="persistAcrossReboots"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
至于具体怎么进行持久化的操作呢,例如当我们APP突然崩溃我们只需要重载onSaveInstanceState()进行保存数据和onRestoreInstance()读取保存的数据即可
- 重载onSaveInstanceState()方法/onRestoreInstanceState()存入数据:
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
outPersistentState.putInt("key",“value”);
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
public void onRestoreInstanceState(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
savedInstanceState.putString("key", "value");
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
- 拿数据、恢复Activity:
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState);
String v1 = null
if (savedInstanceState != null) {
v1 = savedInstanceState.getString("key");
}
至于onSaveInstanceState()和onRestoreInstanceState()的区别:
-
onSaveInstanceState()——页面没有被系统回收,例如:而按HOME键返回桌面,又马上点击应用图标回到原来页面时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume -
onRestoreInstanceState()——页面被系统回收,就是平常说得”非自然销毁“,例如横竖屏切换操作,这时候的activity生命周期如下:(前提没用设置横竖屏不销毁activity的属性 android:configChanges=“orientation|keyboardHidden|screenSize”)
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume -
onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别?
因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。
而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。
而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。
下面是官方文档对onRestoreInstanceState的说明:
This method is called after onStart() when the activity is being re-initialized from a previously saved state,
given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state,
but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses
to decide whether to use your default implementation.
注意!!!
数据持久化的上述方法是API 21提出的,如果低于这个版本就不能使用了!
如果我们不需要采用这种方法进行持久化处理则不需要重写这个方法,直接重写只有一个参数的Bundle savedInstanceState的onCreate方法就行。
综上,如果博客中写的有出错或者侵权,请及时指出!不胜感激。——如果帮助到你,请给个赞吧,笔芯