关于ActivityGroup使用的时候配合返回键的问题解决

     自己开发项目碰到的问题,就是在ActivityGroup中有多个子activity。我想通过按两次返回键来退成应用程序,于是在框架类(ActivityGroup)中加了捕获返回键的工作。但是发现并不凑效。开始并未想到是ActivityGroup的问题,一直以为返回键在其他地方被拦截了。就找了很久没发现问题,于是到网上求救。网上有一些碰到类似的问题,按照他们的方法都不太适应与我的程序。最后发现这一片博客。(地址http://www.cnblogs.com/tanlon/archive/2011/04/23/2025697.html

    内容如下:

   ============================================

在工作中使用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或者其继承类中去就解决了问题。总结一下上面的问题,也就是我们都在逻辑思维上犯了一个相同的错误,也就是上文作者提到的“会误以为ActivityGroup按键事件的优先级高于Activity的按键事件的优先级”。实际上他们不存在优先级的高低。用上述问题解决了以后,我又碰到了另外一个问题,就是所有的返回键捕捉都要放到子的activity中去。如果按照正常的方式,子activity都继承一个baseactivity就可以。但是我有的子activity又不想继承的时候就不好搞。因此我还是想在外面的框架层捕捉这返回事件。这个问题还没搞定,先记录在此。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值