在工作中使用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来切换Activity和Layout
ActivityGroup的用法,头部和底部为固定布局中间动态显示界面 并在中间布局实现手势滑动效果,自定义SlidingDrawer(抽屉)效果,在ActivityGroup里执行跳转等功能。至于在Android在ActivityGroup里执行跳转详细介绍 ...
ActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroupActivityGroup
用ActivityGroup解决TabHost中多个Activity跳转问题 参见http://hkp2008.iteye.com/blog/1185482
ActivityGroup 多个activity页面返回 子activity menu设置
NULL 博文链接:https://fanhongtao.iteye.com/blog/1430893
Android开发—使用ActivityGroup来切换Activity和Layout.pdf
android中tabhost和ActivityGroup的组合使用,特别是对多个Activity之间的跳转,压栈出战的管理,很有帮助。
用ActivityGroup实现的activity栈,类似IOS的UINavigationController
使用GridView+ActivityGroup实现的tab分页效果
ActivityGroup
ActivityGroup和GridView实现标签分页 ActivityGroup和GridView实现标签分页
NULL 博文链接:https://dengyin2000.iteye.com/blog/1632740
一个详细讲解activitygroup类使用方法的工程。
这个源码就是用到TabActivity内嵌ActivityGroup,能很方便的使用,并且能拦截每个界面的返回键,总之是很方便吧。按物理的返回键也能返回到上一个界面,根据自己的项目需求改吧。管理类里面大家可以添加相应的方法,...
Android基于ActivityGroup项目框架,此框架和tabActivity不一样,每个tab下都可以建立多个Activity。
NULL 博文链接:https://1002878825-qq-com.iteye.com/blog/1812628
ActivityGroup之Activity内跳转和外跳转