ActivityGroup window bad token问题深入分析

Posted claireyuancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActivityGroup window bad token问题深入分析相关的知识,希望对你有一定的参考价值。

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456


ActivityGroup window bad token问题深入分析

近期帮别人调试一个webview的页面,非常奇怪的遇到了下面问题:


H5页面中会检測地址中传递的參数,若检測到特定參数异常,则会弹出Dialog进行提示

Dialog:android.view.WindowManager$BadTokenException:


可是在单独的測试project中并没有发生异常,这时我注意到日志中包括localactivitymanager的内容。之后发现果然是仅仅有在TabHost中才会发生这样的情况.


相似的情况,假设我们在ActivityGroup或者TabActivity中的子Activity创建Dialog若使用下面的代码

progressDialog = new ProgressDialog(XXX.this)

创建就会出现例如以下Exception:
05-24 12:34:42.236: ERROR/AndroidRuntime(6362): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?


实际上出现这样的问题的主要原因是显示UI界面时,context选择错误。

由于new对话框的时候,參数content 指定成了this,即指向当前子Activity的content。

但子Activity是动态创建的。不能保证一直存在。

其父Activity的content是稳定存在的,所以有下面的解决的方法


若ActivityGroup中嵌套ActivityGroup,嵌套多少就该使用多少个getParent()。

为什么要使用getParent我们能够从ActivityGroup的内部机制来理解:
TabActivity的父类是ActivityGroup,而ActivityGroup的父类是Activity。因此从Ams的角度来看。ActivityGroup与普通的Activity没有什么差别,其生命周期包括标准的start,stop,resume,destroy等。并且系统中仅仅同意同一时候同意一个ActivityGroup.但ActivityGroup内部有一个重要成员变量。其类型为LocalActivityManager,该类的最大特点在于它能够訪问应用进程的主类,即ActivityThread类。

Ams要启动某个Activity或者赞同某个Activity都是通过ActivityThread类执行的。而LocalActivityManager类就意味着能够通过它来装载不同的Activity,并控制Activity的不同的状态。注意,这里是装载,而不是启动,这点非常重要。所谓的启动,通常是指会创建一个进程(假设所在的应用常常还不存在)执行该Activity,而装载仅仅是指把该Activity作为一个普通类进行载入,并创建一个该类的对象而已,而该类的不论什么函数都没有被执行。

装载Activity对象的过程对AmS来讲是全然不可见的,那些嵌入的Activity仅仅贡献了自己所包括的Window窗体而已。而子Activity的不同状态是通过moveToState来处理的。

所以子Activity不是像普通的Activity一样。它仅仅是提供Window而已。所以在创建Dialog时就应该使用getParent获取ActivityGroup真正的Activity,才干够加Dialog增加Activity中。

假设遇到相似的 window bak token的异常,我们也能够从这个方面着手去分析解决.


以上是关于ActivityGroup window bad token问题深入分析的主要内容,如果未能解决你的问题,请参考以下文章

ActivityGroup中EditText无法删除的问题

在 ActivityGroup 中暂停和恢复子活动

在Android中使用ActivityGroup或Fragments等正确管理导航?

android:使用ActivityGroup嵌入活动

一个activity显示另一个activity,LocalActivityManager实例化不是通过ActivityGroup,

C++/Windows:如何报告内存不足异常(bad_alloc)?