Canxa0notxa0roid异常:p…

2023-05-22


我在一个android项目的开发阶段一直运行良好,直到上线前夕,在一个android项目中运行。 4.03系统的手机运行却给出了一些异常,产生force close:java.lang.IllegalStateException: Can not perform this action after onSaveInstance!



先了解一下我项目的一些基本概况,UI结构是TabActivity包含5个Tabs,每个Tab是另一个单独的Activity。



android发生了异常 在4.03系统中,当我在一个Tab上按下Back键时,我会给出java。.lang.IllegalStateException: Can not perform this action after onSaveInstanceState




整个异常发生的过程都是从logout中发现的:







代码Java



1. Can not perform this action after onSaveInstanceState   
2. android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)   
3. android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)   
4. android.app.Activity.onBackPressed(Activity.java:2066)   
5. android.app.Activity.onKeyUp(Activity.java:2044)   
6. android.view.KeyEvent.dispatch(KeyEvent.java:2529)   
7. android.app.Activity.dispatchKeyEvent(Activity.java:2274)   
8. com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)   
9. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
10. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
11. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
12. com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)   
13. com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)   
14. android.app.Activity.dispatchKeyEvent(Activity.java:2269)   
15. com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)   
16. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
17. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
18. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
19. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
20. android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)   
21. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
22. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
23. android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)   
24. com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)   
25. com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)   
26. android.app.Activity.dispatchKeyEvent(Activity.java:2269)   
27. com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)   
28. android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)   
29. android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)   
30. android.view.ViewRoot.handleMessage(ViewRoot.java:2028)   
31. android.os.Handler.dispatchMessage(Handler.java:99)   
32. android.os.Looper.loop(Looper.java:132)   
33. android.app.ActivityThread.main(ActivityThread.java:4028)   
34. java.lang.reflect.Method.invokeNative(Native Method)   
35. java.lang.reflect.Method.invoke(Method.java:491)   
36. com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)   
37. com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)   
38. dalvik.system.NativeStart.main(Native Method)






上面的异常信息表明,我写的类不是异常的根源。根据异常信息,Can not perform this action after onSaveInstanceState,可知异常原因:在onSaveInstanceState行为之后,app执行了一个无法响应的行为,导致了异常。



在信息at android.app.Activity.onBackPressed(Activity.java:2066),这个说法表明异常发生在响应返回键响应事件的行为上。当我们按下返回键时,我们会对activity实施的响应进行研究:onKeyDown-->onBackPressed-->onPause->onStop->onDestroy。



什么时候实施导火索onSaveInstanceState?



让我们先看看android。 API的一段原文:







代码Java





1. 首先看看Application Fundamentals上的一段话:   
2.    
3.      Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action    
4. as pressing the BACK key)







从上面可以知道,当一个activity变得“容易”并被系统销毁时,除非activity被客户主动销毁,例如当客户按下BACK键时,activity的onSaveInstanceState就会被执行。



请注意上面的双引号,什么是“简单”?不言而喻,activity还没有被销毁,只是一个概率。



onSaveInstanceState的调用遵循一个重要原则,即当系统“未经您的许可”销毁您的activity时,onSaveInstanceState将被系统调用,这是系统的职责,因为它必须为您提供一个存储您数据的机会。




那么为什么在项目中响应onBackPressed事件时会给出上述异常呢?这也说明是after onSaveInstanceState?



这是因为我Tab中的Activity响应了onBackPressed事件,task必须弹出,TabActivity作为它的父器皿,当然也要弹出task,TabActivity 变得“容易”被系统破坏,于是调用onSaveInstanceState存储状态。



现在整个过程都很清楚,但这一切都很正常。这个过程也符合Activity的生命周期。为什么会报告异常?或者最新的安卓 4.03出了问题,难道不是说系统不兼容吗?



对!



经过网上查看,发现API 11 上述一些控件,包括Fragment和ActivityGroup,正在调用。saveInstanceState有一个bug,也许是google。已经修改了saveInstanceState的实现。



直到原因隐藏在后面,解决问题的思路就出来了:让父器皿TabActivityonDestroy在不调用saveInstanceState的情况下onDestroy



在tab上方的activity监控BACK键事件,响应并阻止,然后通过广播方式通知父器皿TabActivity,主动销毁自己,从而达到应对onBackPressed退出App的效果。



本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com