首先我们需要弄清楚onSaveInstanceState方法是在什么时候会被调用,当该Activity即将被销毁前或者按home键退出时调用,来保存Activity数据的,如果在保存玩状态后,桌面通过其他方式启动程序且需要进行Fragment的入栈或弹栈操作就会出错。桌面其他方式如widget、悬浮窗、通知状态栏等方式通过Intent启动程序。
此时拦截该Intent可以在下面的方法中进行
@Override protected void onNewIntent(Intent intent) {
// 拦截Intent,做相应处理
}
如果在这里拦截了Intent进行Fragment的添加和弹栈就会报错:IllegalStateException: Can not perform this action after onSaveInstanceState。不能在onSaveInstanceState之后立即进行这些操作。解决办法目前找到两种
1、在onResume执行Fragment的入栈或弹栈操作,即在onNewIntent中保存Intent,在onResume()中进行处理。推荐使用
private Intent onHomeIntent; // home键退出后通过intent启动程序
@Override
protected void onNewIntent(Intent intent) {
// 拦截Intent,保存Intent,在onResume中进行处理
onHomeIntent = intent;
}
@Override
public void onResume() {
if(onHomeIntent != null){ // home键退出后通过intent启动程序
// dosomething···
onHomeIntent = null;
}
super.onResume();
}
new Handler().post(new Runnable() {
@Override
public void run() {
// do something···
}
});
本文详细介绍了在Android应用中遇到onSaveInstanceState与Fragment操作冲突的情况,提供了解决方案:在onResume中执行Fragment的入栈或弹栈操作,避免了直接在onSaveInstanceState之后进行这些操作导致的IllegalStateException。同时讨论了使用Handler.post()作为替代方案,虽然可以实现操作但体验不佳。推荐使用第一种方法,确保操作时机正确。
507

被折叠的 条评论
为什么被折叠?



