Activity保存状态(一)
来源:互联网 发布:常见的网络硬件有哪些 编辑:程序博客网 时间:2024/06/07 02:48
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.
public class SaveActivity extends Activity{
private String save;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save);
if(savedInstanceState!=null){
save=savedInstanceState.getString("save");
Log.d("SaveActivity", "onCreate方法!!!!!!!!!!save----:"+save);
}
Log.d("SaveActivity", "onCreate方法!!!!!!!!!!savedInstanceState----:"+savedInstanceState);
Log.d("SaveActivity", "onCreate方法!!!!!!!!!!");
}
@Override
protected void onStart() {
super.onStart();
Log.d("SaveActivity", "onStart方法!!!!!!!!!!");
}
@Override
protected void onResume() {
super.onResume();
Log.d("SaveActivity", "onResume方法!!!!!!!!!!");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("SaveActivity", "onRestart方法!!!!!!!!!!");
}
@Override
protected void onPause() {
super.onPause();
Log.d("SaveActivity", "onPause方法!!!!!!!!!!");
}
@Override
protected void onStop() {
super.onStop();
Log.d("SaveActivity", "onStop方法!!!!!!!!!!");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SaveActivity", "onDestroy方法!!!!!!!!!!");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(outState!=null){
outState.putString("save", "保存状态");
}
Log.d("SaveActivity", "onSaveInstanceState方法!!!!!!!!!!");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d("SaveActivity", "onNewIntent方法!!!!!!!!!!");
}
}
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前. 比如当前页面正在运行 突然按下home键。(在onPause之后在onStop之前,即在两者中间调用)
onSaveInstanceState()方法的默认实现
如果开发者没有覆写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据, 比如activity中各种UI控件的状态. android应用框架中定义的几乎所有UI控件都恰当的实现了onSaveInstanceState()方法, 因此当activity被摧毁和重建时, 这些UI控件会自动保存和恢复状态数据. 比如EditText控件会自动保存和恢复输入的数据, 而CheckBox控件会自动保存和恢复选中状态. 开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可), 剩余的事情就可以自动完成了. 如果没有为控件指定ID, 则这个控件就不会进行自动的数据保存和恢复操作.
由上所述, 如果开发者需要覆写onSaveInstanceState()方法, 一般会在第一行代码中调用该方法的默认实现: super.onSaveInstanceState(outState).
是否需要覆写onSaveInstanceState()方法
既然该方法的默认实现可以自动的保存UI控件的状态数据, 那什么时候需要覆写该方法呢?
如果需要保存额外的数据时, 就需要覆写onSaveInstanceState()方法. 如需要保存类中成员变量的值
onSaveInstanceState()方法适合保存什么数据
由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等.
引发activity摧毁和重建的其他情形
除了系统处于内存不足的原因会摧毁activity之外, 某些系统设置的改变也会导致activity的摧毁和重建. 例如改变屏幕方向 改变设备语言设定, 键盘弹出等.
- Activity保存状态(一)
- activity状态保存讲解一
- 保存Activity的状态
- 保存Activity的状态
- 保存Activity的状态
- 保存Activity的状态
- Activity状态保存
- Activity的状态保存
- activity的状态保存
- Activity状态保存
- Activity状态保存
- ACTIVITY状态保存
- 保存活动(Activity)状态
- Activity状态的保存
- 保存Activity的状态
- 保存activity状态
- 保存Activity的状态
- Activity保存状态
- 8大排序算法
- 通过URL打开APP
- Kubernetes 1.5版本之简单安装
- Sqoop导入hive分隔符问题
- MySql事务
- Activity保存状态(一)
- server_sql 面试题1
- iconfont loading animate
- Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a futu
- java语言 验证码解析 图片大小转化
- Java设计模式——代理模式实现及原理
- 二次封装函数
- 按字典顺序打印字符串的所有排列
- UBI文件系统