我们在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?
而该使用:
progressDialog = new ProgressDialog(getParent())
若ActivityGroup中嵌套ActivityGroup,嵌套多少就该使用多少个getParent()。
为什么要使用getParent我们可以从柯元旦的《Android内核剖析》中第十章”Ams内部原理“中的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中。
分享到:
相关推荐
2. 创建子Activity的Intent,并使用LocalActivityManager的startActivity()方法启动Activity。 3. 使用LocalActivityManager的getWindow()方法获取子Activity的窗口,以便在TabHost中显示。 4. 实现...
在Android开发中,ActivityGroup是一种特殊类型的Activity,它允许开发者在一个Activity内嵌套其他Activity,实现类似TabHost或Fragment的效果,但这是在Android早期版本(API级别较低)中的一种实现方式。...
首先,ActivityGroup是Android早期版本(API 13之前)中用于在同一个Activity中管理多个子Activity的类。它允许开发者在一个TabHost或者帧布局(FrameLayout)中嵌套其他Activity,从而实现类似选项卡的效果。不过,...
ActivityGroup 是 Android 中的一种特殊的 Activity,它可以容纳多个 Activity,并且可以在这些 Activity 之间进行切换。使用 ActivityGroup,可以实现非常复杂的界面跳转逻辑,而不需要使用 Fragment 或者其他第三...
首先,ActivityGroup是Android早期版本中的一种特殊类型的Activity,它允许在一个Activity内嵌套其他Activity。在本项目中,ActivityGroup被用作容器,用来管理在选项卡切换时显示的不同内容页面。开发者通常会重写...
这样,在TabHost中,我们可以创建一个包含多个子Activity的ActivityGroup,而不是创建多个独立的Activity,从而简化了回退栈的管理和内存管理。 具体实现ActivityGroup的方法包括: 1. **定义ActivityGroup**:...
1. **ActivityGroup**:在Android早期版本(API级别低于11)中,ActivityGroup是一个特殊的Activity,它允许在同一个Task(任务栈)中嵌套多个子Activity。这种设计可以使得在单个Activity内展示多个页面,比如模仿...
首先,ActivityGroup是Android早期版本(API级别低于11)中的一个类,用于在一个Activity中嵌套其他Activity。它允许开发者创建类似TabHost的效果,但不依赖于系统提供的TabWidget。在ActivityGroup中,每个子...
接着,我们为每个选项卡创建一个子Activity,并将它们添加到ActivityGroup中。在子Activity中,我们使用GridView来展示数据。通过ViewFlipper的setDisplayedChild方法,我们可以轻松地在不同的选项卡之间进行切换。 ...
在Android应用开发中,"ActivityGroup + GridView + ViewFlipper 实现选项卡"是一个常见的设计模式,用于构建具有多视图切换功能的用户界面。这个毕业设计项目利用了Android SDK中的几个关键组件来创建一个交互丰富...
ActivityGroup是一种旧版的Android实现,它允许在一个Activity中嵌套多个子Activity,这在早期版本的Android系统中常用于实现类似TabHost的效果。然而,自Android 3.0(API级别11)起,Android引入了Fragment的概念...