如有转载,请声明出处: 时之沙: 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 android.app.LocalActivityManager$LocalActivityRecord@43e5b158 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问题深入分析的更多相关文章

  1. Android之window机制token验证

    前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...

  2. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...

  3. WmS详解(一)之token到底是什么?基于Android7.0源码

    做Android有些年头了,Framework层三大核心View系统,WmS.AmS最近在研究中,这三大块,每一块都够写一个小册子来介绍,其中View系统的介绍,我之前有一个系列的博客(不过由于时间原 ...

  4. 使用json web token

    由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...

  5. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...

  6. Android窗口系统第二篇---Window的添加过程

    以前写过客户端Window的创建过程,大概是这样子的.我们一开始从Thread中的handleLaunchActivity方法开始分析,首先加载Activity的字节码文件,利用反射的方式创建一个Ac ...

  7. Android全面解析之Window机制

    前言 你好! 我是一只修仙的猿,欢迎阅读我的文章. Window,读者可能更多的认识是windows系统的窗口.在windows系统上,我们可以多个窗口同时运行,每个窗口代表着一个应用程序.但在安卓上 ...

  8. Springboot之登录模块探索(含Token,验证码,网络安全等知识)

    简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端登录状 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

随机推荐

  1. HDU 1856 More is better (并查集)

    题意: 给你两个数代表这两个人是朋友,朋友的朋友还是朋友~~,问这些人组成的集合里面人最多的是多少... 思路: 属于并查集了,我用的是带路径压缩的,一个集合里面所有元素(除了根节点)的父节点都是根节 ...

  2. 树链剖分【p4116】Qtree3 - Query on a tree

    Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...

  3. 机器人搬重物(BFS)

    机器人搬重物 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 10[提交][状态][讨论版] 题目描述 机 器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一 ...

  4. SQL Loader with utf8

    alter this line in your control file characterset UTF8 to this characterset UTF8 length semantics ch ...

  5. [Atcoder Regular Contest 063] Tutorial

    Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; ,len; ...

  6. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...

  7. 快速创建Django验证码

    # 生成随机验证码图片 import stringfrom random import randint, samplefrom PIL import Image, ImageDraw, ImageFo ...

  8. 7.3(java学习笔记)网络编程之UDP

    一.UDP UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议, 传输数据时发送方和接收方无需建立连接,所以是不安全的. 发送时不建立连接直接 ...

  9. 1.1(java学习笔记) 面向过程与面向对象

    面向过程思考时,我们会先思考具体的步骤,第一步走什么,第二步做什么. 比如电脑新建文件夹,第一步:打开电脑 第二步:按下鼠标右键. 第三步:找到新建选项 第四步:点击新建选项下的文件夹 c语言是典型的 ...

  10. POP3、IMAP、SMTP邮件协议的理解

    一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 CSDN博客链接: http://blog.csdn.net/my_confesser    正文   今天入职配置OutLook的时候,看到公司的 ...