在工作中使用ActivityGroup的时候犯了一个严重的错误,后来经过头的点播,才豁然开朗,明白了这中间的道理,现在这些心得记录下来。
在刚开始接触ActivityGroup的时候我把它当成了J2EE中的框架集(framset)来使用,framset也是可以同时加载多个jsp页面。而ActivityGroup也是是可以管理多个Activity,很容易就把他当成framset 来看待。
其实不然,我们知道在Android中只允许一个Activity活动在当前界面,在这里我们就不能同时让多个Activity同时存活在ActivityGroup中,当我们加载一个Activity到ActivityGroup中来的时候我们要做的就是移除其他的存在于当前 ActivityGroup中的view,然后加载需要的Activity到当前的ActivityGroup中来。
LinearLayout container=(LinearLayout)((ActivityGroup)getParent()).getWindow().findViewById(R.id.body);//注意这里,还是获取group的view
container.removeAllViews();
Intent intent=new Intent(a.this,b.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Window subActivity=((ActivityGroup)a.this.getParent()).getLocalActivityManager().startActivity(“locallist”,intent);
container.addView(subActivity.getDecorView());
下面这些是从LocalActivityManager.startActivity()官方文档翻译过来的:
给你将要启动的Activity设置一个唯一的字符串ID与之关联,因此,如果你以后调用startActivity()的上一次相同的活动对象将被保留。
当以前的活动根据这个ID开始,就可能要么被摧毁,以一个新的开始,或者当前的一个再利用。
如果当前活动采用非多重启动模式(如singleTop),或意图有Intent.FLAG_ACTIVITY_SINGLE_TOP标志设置,那么当前活动将继续运行,Activity.onNewIntent()方法调用。
如果新的意图是与前一个相同,而新的意图没有Intent.FLAG_ACTIVITY_CLEAR_TOP设置,那么当前的活动将继续运行原样。否则,目前的活动将结束,一个新的开始。
有一个问题,即,如果其目的不包括一个明确的组成部分,我们可以恢复,这比以前运行时的状态被保存不同的活动课的状态(如果可用的活动点之间的变更集)。
getDecorView():
新添加窗口到窗口管理器中。
当我们要从b.class中跳转回到a.clas的时候,我们要先找到他对应的资源ID号,然后执行和上面跳转一样的操作。
LinearLayout container=(LinearLayout)((ActivityGroup)getParent()).getWindow().findViewById(R.id.body);//注意这里,还是获取group的view
container.removeAllViews();
Intent intent=new Intent(b.this,a.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
((ActivityGroup)b.this.getParent()).getLocalActivityManager().removeAllActivities();
Window subActivity=((ActivityGroup)b.this.getParent()).getLocalActivityManager().startActivity(”locallist“,intent);
container.addView(subActivity.getDecorView());
这里就是关于在ActivityGroup中的跳转和向回跳转的方法。要特别注意的是只能允许一个Activity活动在当前的ActivityGroup 中。当你startActivity的时候会按照你给定的资源ID去ActivityManager中去查找Activity,这个Activity只有两种状态,要么存在要么被销毁了。
另外就是在acitivityGroup中捕获返回键的按键事件,我们通常是这样处理的
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//这里放捕获按键处理事件
}
return super.onKeyDown(keyCode, event);
}
我们会发现我们捕获按键没用了,很多人就会误以为ActivityGroup按键事件的优先级高于Activity的按键事件的优先级。其实这也是一个误区,他们的按键事件是优先级是一样的,不存在谁的优先级高于谁 ,只是我们这里对按键事件的处理有一些问题,我们应该这样做:
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)
{
//这里放捕获按键处理事件
return true;
}else
return super.onKeyDown((keyCode, event);//除了捕获你想要的返回键之外,其余的应该交给他的父类去处理
}
分享到:
相关推荐
- 兼容性问题:由于`ActivityGroup`在API 11后被弃用,对于支持新版本Android系统的应用来说,使用`ActivityGroup`可能会导致兼容性问题。 - 生命周期管理:`ActivityGroup`管理的子Activity生命周期可能会变得复杂...
在Android开发中,ActivityGroup是早些版本API中提供的一种特殊类型的Activity,它允许开发者在一个TabHost或者帧布局(FrameLayout)中嵌套多个Activity,从而实现类似iOS中UINavigationController的堆叠管理器效果...
在实现过程中,我们首先需要创建一个`ActivityGroup`的子类,比如`MyActivityGroup`,并重写其关键方法。这些方法包括: 1. `onCreate()`:在这个方法中,我们需要初始化`LocalActivityManager`,并设置其管理的`...
然而,在早期的Android版本中,如果每个选项卡都用独立的Activity实现,那么在Activity之间进行跳转时可能会遇到一些问题,比如回退栈管理复杂、内存消耗高等。为了解决这些问题,开发者引入了ActivityGroup,它允许...
`ActivityGroup`在早期的Android版本中被用来解决在同一个栈内管理多个`Activity`的需求,但在Android 3.0(API Level 11)之后,官方推荐使用`Fragment`来替代,因为`Fragment`提供了更灵活且性能更好的解决方案。...
在实际项目中,我们可以将TabHost和Fragment结合使用,每个标签页都包含一个Fragment容器,然后在Fragment之间进行切换,这样既能实现动态内容加载,又能避免因使用ActivityGroup带来的潜在问题。对于旧项目改造,...
ActivityGroup的用法,头部和底部为固定布局中间动态显示界面 并在中间布局实现手势滑动效果,自定义SlidingDrawer(抽屉)效果,在ActivityGroup里执行跳转等功能。至于在Android在ActivityGroup里执行跳转详细介绍 ...
在Android开发中,ActivityGroup是一种特殊类型的Activity,它允许开发者在一个Activity内嵌套其他Activity,实现...然而,理解ActivityGroup的历史和工作原理仍然是学习Android开发历史和演进过程中的一个重要环节。
这种方式虽然能实现类似Fragment的效果,但因为ActivityGroup的局限性,建议尽量避免在新项目中使用。 总的来说,TabHost和ActivityGroup是Android早期的组件,现在已经被Fragment和FragmentManager所取代。虽然...
ActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroup
3. **setContentView()**:在ActivityGroup中,我们不能直接使用setContentView()方法加载布局,而是需要通过LocalActivityManager的startActivity()和getWindow()方法来设置子Activity的视图。 4. **...
在Android开发中,创建一个具有分页功能的Tab布局是常见的需求,这通常涉及到GridView和ActivityGroup的结合使用。下面将详细解释这两个组件以及如何利用它们实现Tab分页。 首先,`GridView`是Android的一种视图...
在Android开发中,ActivityGroup是一种特殊的布局管理器,它允许在一个TabHost中嵌套多个Activity。这个框架的设计目的是为了...在学习和使用过程中,应结合最新的开发规范和技术趋势,以确保代码的可维护性和兼容性。
7. **升级到Fragment**:虽然ActivityGroup在现代Android开发中已经较少使用,但理解它的工作原理有助于理解Fragment。通常,开发者会被鼓励将ActivityGroup的代码重构为使用Fragment,以利用Fragment提供的更丰富的...
然而,由于ActivityGroup存在一些问题,如内存泄漏、回退栈管理复杂等,所以在后来的版本中被废弃,推荐使用Fragment来替代。但是,对于理解旧版应用或学习历史知识,了解ActivityGroup仍然很有价值。 GridView则...
2. **兼容性问题**:随着Android API的更新,`ActivityGroup`在后来的版本中被弃用,对于新版本的Android系统,使用`ActivityGroup`可能会遇到不兼容或不稳定的问题。 3. **代码复杂性**:使用`ActivityGroup`往往...
5. **外跳转处理**:在子Activity中,当需要跳转到不在ActivityGroup内的Activity时,使用`startActivityForResult()`或`startActivity()`,然后在ActivityGroup中监听并处理结果,以保持返回栈的正确性。...
这个过程通常需要重写`startChildActivity()`方法,以便在ActivityGroup内部管理子Activity的生命周期。例如: ```java public void startChildActivity(String tag, Intent intent) { Window window = ...
在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment的概念是在Android 3.0...如果你在使用过程中遇到问题,可以参考提供的博客链接或在社区里留言寻求帮助。
在上面的代码中,我们使用 Intent 来启动不同的 Activity,并且使用 startSubActivity 方法来在 ActivityGroup 中启动这些 Activity。然后,我们可以使用 setContentView 方法来加载不同的ContentView。 最后,我们...