【android学习】onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
来源:互联网 发布:商城首页广告设计 php 编辑:程序博客网 时间:2024/06/03 11:17
1,问题
1)问题一:按home键后,app后台运行,若内存紧张时,再次进入app会出现异常。
2)改变手机设置中字体大小,app再次进入出现异常。
手机切换字体后,app异常崩溃。configChanges详解
2,解决方案
1)写一个继承Activity的BaseActivity,重写onSaveInstanceState方法,用于app异常退出时保存临时数据。并在oncreate方法中读取Bundle参数,获取异常退出时保存的数据。
2)所有activity都继承BaseActivity,并在onCreate中读取Bundle,用于获取异常退出时保存的数据。
3)Demo
BaseActivity中:
@Overrideprotected void onCreate(Bundle savedInstanceState) {if (null != savedInstanceState&& (null == UserData.getInstance().getUser() || null == UserData.getInstance().getUser().UserId)){UserInfo user = new UserInfo();user.UserCode = savedInstanceState.getString("UserCode");user.UserName = savedInstanceState.getString("UserName");UserData.getInstance().setUser(user);savedInstanceState = null;}super.onCreate(savedInstanceState);
/** * 用于保存Activity的状态信息(UI控件的状态信息)和用户保存的信息。 * ①用户登录信息:UserCode, UserName */@Overrideprotected void onSaveInstanceState(Bundle outState) {try {outState.putString("UserCode", UserData.getInstance().getUser().UserCode);outState.putString("UserName", UserData.getInstance().getUser().UserName);} catch (Exception e) {System.out.println(Tag + "onSaveInstanceState");}}//@Override//protected void onRestoreInstanceState(Bundle outState) {////try {//UserInfo user = new UserInfo();//user.UserCode = outState.getString("UserCode");//user.UserName = outState.getString("UserName");//UserData.getInstance().setUser(user);//} catch (Exception e) {//System.out.println(Tag + "onRestoreInstanceState");//}//}
3,原因
1)过程
出现1中的两个问题,甚至类似问题,如横竖屏切换出现异常,主要原因是系统重新刷新了界面,调用了activity的onDestroy(),onCreate(),onResume()方法。但上次activity的信息为保存,以至于重新刷新界面时出现数据丢失(如用户登录信息、视频进度、上个activity切换到当前activity传递的数据),继而出现异常。
2)onSaveInstanceState()
i>场景
通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。
ii>触发
系统即将要自动清理销毁Activity或Fragment前才会调用。
①系统内存不足,销毁activity。
②用户按下HOME键或长按HOME键,选择运行其他的程序时。
③按下电源按键(关闭屏幕显示或锁屏)时。
④从activity A中启动一个新的activity时。
当我们在activity A时,此时通知栏有其他的通知,我们点击通知启动activity B,此时我们进入别的应用。
⑤屏幕方向切换时,例如从竖屏切换到横屏时。
iii>不触发
例如在应用中按返回键,onSaveInstanceState()就不会被调用。
因为在这种情况下,用户的行为决定了不需要保存Activity的状态。
4)onRestoreInstanceState()
这个方法在一个activity被杀死后,当该activity在将来某个时刻回来时调用。
根据测试,发现onRestoreInstanceState调用的时间不定,可能在activity的oncreat方法里很多代码都执行完了才调用,依然会造成数据丢失。所以根据实际情况,可能oncreat中读取传入的Bundle参数更好一点。
- 【android学习】onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
- 【问题解决】configChanges详解-之解决问题:手机切换字体后,app异常崩溃
- Android开发之app崩溃后捕获异常或自动重启
- Android学习之 应用崩溃异常处理
- Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机
- Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机
- Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机
- Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机
- Android:处理程序崩溃异常
- Android:处理程序崩溃异常
- Android程序异常崩溃处理
- Android APP进程保护,在APP进程异常崩溃后能够重启
- Android程序崩溃异常处理之自动发送邮件
- Android程序崩溃异常处理之自动发送邮件
- Android开发之onSaveInstanceState和onRestoreInstanceState详解
- Android开发之OnSaveInstanceState和onRestoreInstance详解
- android app崩溃后自动重启
- android onSaveInstanceState 详解
- STM---串口发送数据,第一个数据无法发送的解决方法
- VC/MFC 实现文件拖拽获取文件名(WM_DROPFILES)
- Vs2005下成功调用 av_register_all
- Windows10 无法识别手机MTP问题
- C#序列化与反序列化类集合
- 【android学习】onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
- oj期中测验--C语言实验——for循环打印图形(循环结构)(1954)
- java的System.getProperty()方法可以获取的值
- 单工、半双工、全双工的区别
- OpenCV Python的安裝與設定
- Java动态代理
- Android 跨进程通信Aidl的使用及注意事项
- HttpClient简单请求和session的保持
- FastDFS Storage配置详解