在android中如果一个应用程序被按Home键回到桌面了,这个时候应用程序就处于后台运行状态,后台运行状态的应用在系统内存不足的情况下有可能会被系统回收掉。我们可以用Android DDMS模拟一下把进程kill掉。然后重新进入应用的重启情况。
导致的问题
- application存储数据重获取空指针
- 重启的activity数据未被保存和恢复
- 重启的activity获取到null数据
流程图
这个是app从启动-退出后台-系统kill-重启的一个流程
流程图
-
系统kill执行的逻辑
可以看到我们先是启动了三个页面 A>B>C,等到了C页面的时候我们回到桌面让APP在后台运行。
现在用DDMS模拟一下把应用程序kill掉。可以看到图中的a b c三个activity的 onSaveInstanceState都被调用了。
这是应用app被异常终止了,onSaveInstanceState会在这种情况下调用来保存activity的数据。 -
重启执行的逻辑
现在我们重新进入到app后,application会先被重新创建,最后的 C 页面重新创建 onCreate方法中的savedInstanceState不为null说明activity被重建了。如果实现了onRestoreInstanceState方法也会被调用。这个时候的activity是在新创建的线程中,如果我们back到B页面中,B也会执行和C一样的生命周期流程,B back A后,也是一样。
处理办法
-
application数据null的问题:
首先说到的系统被kill了,那么我们自定义的application也会被回收掉。情况就是如果我们在application
中存储了一些数据,在app重启后会新创建一个application,这个时候去获取数据会导致空指针的异常错误。所以明白这点后我们不要在application中去存储数据,如果真要存储也需要做非空判断和数据恢复的操作。 -
activity数据恢复问题:
首先每个项目的需求逻辑不一样,数据要怎么恢复要根据实际需求。如果重启后需要做数据恢复,那么可以在onCreate中判断savedInstanceState对象是否为null,如果不为空那就代表程序被异常创建了。满足条件后如果需要数据恢复,那就可以在这里做重新获取数据和刷新UI的操作了。 -
还有一种是当前页面的数据是从其他页面获取过来的,重启后在当前页面无法重新获取,那就需要把当前页面finish,startActivity到正确的activity获取数据。
网友评论