温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

activity 异常被杀死数据保存的处理

发布时间:2020-07-16 13:57:00 阅读:1880 作者:yangxiaoming123 栏目:开发技术

从界面跳转后被系统Kill来看Activity的方法调用

在xx手机上速配出现bug修复的任务,软件在xx手机上打开,跳过一个界面,就把上一个界面给Kill了,刚开始以为是xx手机修改了android系统,后来发现是手机太烂了,内存太低了,每次跳转都因内存不足把上个界面给Kill了,正好让我复习和实际运用一下Activity中的onSaveInstanceState方法和onRestoreInstanceState方法!

1、让程序出现被系统kill的场景,而且onSaveInstanceState方法和onRestoreInstanceState方法都调用!

A、运行你的程序,当程序打开时,按HOME键,这时系统会调用onSaveInstanceState方法,注意:这个方法的调用是系统决定的,不是软件或者其他什么因素,系统觉得有可能在某个时间因内存不足等因素而Kill掉你,所以给你个机会让你现在先利用这个方法保存下数据,所以调用onSaveInstanceState方法。

activity 异常被杀死数据保存的处理

B、一般情况下,即使你在onSaveInstanceState保存了数据,在系统没Kill掉程序的情况下,你再回到刚关闭的界面,你也会感觉刚才调用onSaveInstanceState方法保存的数据没什么作用,只有在系统kill掉程序的情况下,再回到刚关闭的界面,回调了onRestoreInstanceState方法,这时onSaveInstanceState方法保存的数据,才发挥真正的作用,如何重现这种场景呢,利用DDMS替系统干这件坏事,kill掉你的程序:在按下HOME键后,系统已经调用你的onSaveInstanceState方法,打开DDMS找到你的程序进程,stop你的进程,再打开程序!

activity 异常被杀死数据保存的处理

activity 异常被杀死数据保存的处理

注意:Activity调用OnCreate方法来初始化界面,它在onRestoreInstanceState方法之前调用!

2、如果从MainActivity中通过Intent携带数据打开BActivity,BActivity界面被系统kill后,重新创建BActivity后之前携带的数据是会还原的,但该界面被杀之前对传过来的数据做的任何修改都作废!

3、onSaveInstanceState方法的参数(Bundle savedInstanceState) == onRestoreInstanceState方法参数(Bundle savedInstanceState)  == onCreate方法参数(Bundle savedInstanceState) ,第一次创建Activity时,调用onCreate方法,传进来的参数是为null,但如果出现被系统kill又被重建时调用onCreate的场景,onCreate方法的参数就是onSaveInstanceState方法和onRestoreInstanceState方法参数的值!通过在onCreate方法判断if(savedInstanceState
== null ) 是否被重建并存有数据!

4、界面上的View也都有onSaveInstanceState方法和onRestoreInstanceState方法,系统也是通过调用它们来存储界面和恢复界面的数据,系统会调用Activity对应的onSaveInstanceState方法之前调用界面View的onSaveInstanceState方法!

BActivity.java

CustomView.java:只是继承了Button,重写了Button的onSaveInstanceState方法和onRestoreInstanceState方法

activity 异常被杀死数据保存的处理

5、从BActivity打开CActivity用StartActivityForResult方法要求CActivity finish时回传数据回BActivity,在跳转到CActivity后BActivity被系统Kill了,当CActivity finish时,系统重建BActivity,onActivityResult方法依然能收到上个界面回传的数据!(这个场景的出现就是在CActivity界面时用DDMS kill程序,重建CActivity再从CActivity回到BActivity就可以看到BActivity被重建,依然可以获得CActivity回传的数据)代码

BACtivity.java

CActivity.java

activity 异常被杀死数据保存的处理

结论:

1、从A界面-->B界面-->C界面,用A界面通过Intent传过来的数据,即使B界面到C界面后B界面被杀了,再回到B界面,B界面还是拿得到A界面传过来的数据,但还是原始Intent的数据,如果B界面在被杀之前对Intent数据加工,通过onSaveInstanceState存储,通过onRestoreInstanceState统一处理了,那么就要绕过之前A界面通过Intent传过来的原始数据的干扰。

2、B界面-->C界面,B界面被kill了,C界面finish后,系统重建B界面,依然能拿到C界面回传的数据。

3、注意onCreate(Bundle saveInstanceSate)方法参数Bundle saveInstanceSate的作用

4、View也有onSaveInstanceState方法和onRestoreInstanceState方法

源代码:http://download.csdn.net/detail/ak5700/6661497

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI