【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参数更好一点。


0 0
原创粉丝点击