本人小白,大学期间,打算开始自学Android,准备用博客写下所学所得,希望有所收获,望大家互相帮助


当一个活动进入到了停止状态,是有可能被系统回收的。那么想象以下场景,应用中有一个活动 A,用户在活动 A 的基础上启动了活动 B,活动 A 就进入了停止状态,这个时候由于系统内存不足,将活动 A 回收掉了,然后用户按下 Back 键返回活动 A,会出现什么情况呢?其实还是会正常显示活动 A的,只不过这时并不会执行 onRestart()方法,而是会执行活动 A onCreate()方法,因为活动 A 在这种情况下会被重新创建一次。

这样看上去好像一切正常,可是别忽略了一个重要问题,活动 A 中是可能存在临时数据和状态的。打个比方, MainActivity 中有一个文本输入框,现在你输入了一段文字,然后启动 NormalActivity,这时 MainActivity 由于系统内存不足被回收掉,过了一会你又点击了Back 键回到 MainActivity,你会发现刚刚输入的文字全部都没了,因为 MainActivity 被重新创建了 。


如果我们的应用出现了这种情况,是会严重影响用户体验的,所以必须要想想办法解决这个问题。查阅文档可以看出, Activity 中还提供了一个 onSaveInstanceState()回调方法,这个方法会保证一定在活动被回收之前调用,因此我们可以通过这个方法来解决活动被回收时,临时数据得不到保存的问题。

onSaveInstanceState()方法会携带一个 Bundle 类型的参数, Bundle 提供了一系列的方法用于保存数据,比如可以使用 putString()方法保存字符串,使用 putInt()方法保存整型数据,以此类推。

每个保存方法需要传入两个参数

第一个参数是键,用于后面从 Bundle 中取值

第二个参数是真正要保存的内容。 


MainActivity 中添加如下代码就可以将临时数据进行保存:

protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}

数据是已经保存下来了,那么我们应该在哪里进行恢复呢?

我们一直使用的 onCreate()方法其实也有一个 Bundle 类型的参数。这个参数在一般情况下都是
null,但是当活动被系统回收之前有通过 onSaveInstanceState()方法来保存数据的话,这个参
数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。

修改 MainActivity onCreate()方法,如下所示:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}

……
}
取出值之后再做相应的恢复操作就可以了,比如说将文本内容重新赋值到文本输入框上,这里我们只是简单地打印一下。

我们在使用 Intent 传递数据时也是用的类似的方法。

 Intent 还可以结合Bundle 一起用于传递数据的,首先可以把需要传递的数据都保存在 Bundle 对象中,然后再
Bundle 对象存放在 Intent 里。 到了目标活动之后先从 Intent 中取出 Bundle,再从 Bundle
中一一取出数据。


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android(安卓)关于接口回调原理的解析
  4. android java进程管理(六)之apk进程的回收
  5. 浅析RxJava 1.x&2.x版本使用区别及原理(一):Observable、Flowable等
  6. Android(安卓)使用MVPHelper工具生成,MVPDemo模拟登录演示
  7. android 测量控件视图的方法
  8. Android(安卓)利用SurfaceView实现一个简单的计时器
  9. Android中实现「类方法指令抽取方式」加固方案原理解析

随机推荐

  1. MySQL按照汉字的拼音排序简单实例
  2. mysql 5.7.17 安装配置方法图文教程(ubunt
  3. windows无法启动MySQL服务报错1067的解决
  4. mysql 5.7.17 winx64安装配置图文教程
  5. mysql 5.7.17 安装配置方法图文教程(windo
  6. Ubuntu16.04 server下配置MySQL,并开启远
  7. mysql 5.7.17 winx64安装配置方法图文教
  8. mysql免安装没有任何root权限
  9. 浅谈mysql数据库中的换行符与textarea中
  10. MySQL实时监控工具orztop的使用介绍