您的位置:首页 > 移动开发

【android学习】onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常

2017-01-01 15:53 826 查看

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中:

@Override
protected 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
*/
@Override
protected 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中的两个问题,甚至类似问题,如横竖屏切换出现异常,主要原因是系统重新刷新了界面,调用了activity的onDestroy(),onCreate(),onResume()方法。但上次activity的信息为保存,以至于重新刷新界面时出现数据丢失(如用户登录信息、视频进度、上个activity切换到当前activity传递的数据),继而出现异常。

点击打查看详情:Activity的onFreeze
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: