`

ActivityGroup的子activity响应back事件的顺序问题

 
阅读更多

昨天发现一个问题,是当我用ActivityGroup实现多activity跳转的时候用户按下back键直接从子activity退出应用,没有响应到activitygroup的onkeydown事件.其实可以在每个子activity覆写onkeydown事件弹出退出应用提示,但是就是想搞清楚为什么在子activity上按back就直接退出了而不响应到主activitygroup的onkeydown事件.如果可以响应,那么我们在主activityGroup里写一个退出提示框就可以了.这样不是可以省点代码吗.后来发现子activity是listview的时候里边的数据发生变化后就会先响应自己的onkeydown事件,如果子activity是非listview的可以直接响应到主activityGroup的onkeydown事件.(这里的前提是每个子activity都不覆写onkeydown事件只有activityGroup实现这个事件)后来查资料实验后给listview覆写onkeydown事件但是返回false.这样就可以将事件传递到主activityGroup里去响应了.总之比在子activity里覆写onkeydonw事件实现一堆逻辑要少一些代码的.子listview可以写:

主acitivtyGroup可以写:

以下是我查到的资料,很有用.

键盘事件只会发送到当前获得焦点的View,这个KeyEvent只能被最上层获得焦点窗口的activity和view得到。一般来说这些事件会从上倒下去寻找合适的接受组件,ViewGroup的一个childView的onKeyDown()方法return true,那么表示该方法消费了此次事件,此时不会再传递到ViewGroup的onKeyDown()方法,如果onKeyDown()方法return false,那么表示该方法并未处理完全,该事件仍然需要以某种方式传递下去继续等待处理,这时传递到ActivityGroup的onKeyDown()方法。但是KeyEvent.KEYCODE_MENU不会传递到ActivityGroup去。

一个ActivityGroup的键盘事件处理
按下按键时执行
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行ActivityGroup onUserInteraction
最后执行ActivityGroup onKeyDown

松开按键时执行
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_UP)
然后执行ActivityGroup onUserInteraction
最后执行ActivityGroup onKeyDown

如果childView是listView,按上下键选择列表时的事件执行流程
按下键时
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行ActivityGroup onUserInteraction
然后执行childActivity dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行childActivity onUserInteraction
松开键时
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_UP)
然后执行ActivityGroup onUserInteraction
然后执行childActivity dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_UP)
然后执行childActivity onUserInteraction
然后执行childActivity onKeyUp
最后执行ActivityGroup onKeyUp


如果焦点在childView的listView上,按Menu键的事件
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行ActivityGroup onUserInteraction
然后执行childActivity dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行childActivity onUserInteraction
最后执行childActivity onKeyDown
松开键时
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_UP)
然后执行ActivityGroup onUserInteraction
然后执行childActivity dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_UP)
然后执行childActivity onUserInteraction
然后执行childActivity onKeyUp


如果焦点在childView的listView上,按Back键的事件
首先执行ActivityGroup dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行ActivityGroup onUserInteraction
然后执行childActivity dispatchKeyEvent (event.getAction()==KeyEvent.ACTION_DOWN)
然后执行childActivity onUserInteraction
然后执行childActivity onKeyDown
最后执行ActivityGroup onKeyDown

Activity.dispatchKeyEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的键盘事件。
由上面可知,当焦点在childView的listView上时,没有执行ActivityGroup onKeyDown,而有执行ActivityGroup的dispatchKeyEvent,因此可以在ActivityGroup的dispatchKeyEvent来捕获childActivity的Menu键事件

分享到:
评论
1 楼 feargod 2012-07-11  

相关推荐

    使用ActivityGroup管理Activity

    - 生命周期管理:`ActivityGroup`管理的子Activity生命周期可能会变得复杂,容易导致内存泄漏和状态恢复问题。 - 性能:相比Fragment,`ActivityGroup`在处理复杂的UI层级和动画时,性能可能较差。 - 代码复杂性:...

    ActivityGroup之Activity内跳转和外跳转

    例如,当从子Activity调用`finish()`方法时,ActivityGroup应该能够正确处理返回栈,以便用户可以通过按回退键返回到先前的子Activity,而不是退出整个应用。 在处理外跳转时,可能需要重写`onKeyDown()`方法,监听...

    ActivityGroup之activity内跳转和外跳转

    5. **外跳转处理**:在子Activity中,当需要跳转到不在ActivityGroup内的Activity时,使用`startActivityForResult()`或`startActivity()`,然后在ActivityGroup中监听并处理结果,以保持返回栈的正确性。...

    用ActivityGroup解决TabHost中多个Activity跳转问题

    4. **处理回退键**:由于ActivityGroup内的Activity不在系统回退栈中,因此需要重写onKeyDown方法,以便正确处理回退键事件。当按下回退键时,应该先关闭当前子Activity,如果当前子Activity为空,则关闭整个...

    使用ActivityGroup来切换Activity和Layout

    `ActivityGroup`是`Sherlock`库中的一个类,它扩展了`Activity`,并提供了管理子`Activity`的能力。通过`LocalActivityManager`,我们可以启动、切换和管理子`Activity`,同时保持它们的状态。 在实现过程中,我们...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    - ActivityGroup是Android早期的解决方案,它继承自Activity,提供了一种在同一个父Activity中加载和切换子Activity的能力。 - 主要方法:`startChildActivity(String name, Intent intent)`用于启动一个新的子...

    activitygroup

    当子`Activity`的菜单被触发时,需要确保事件能够正确传递到子`Activity`处理。 ```java @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater....

    ActivityGroup实现Activit栈

    - 在ActivityGroup中,可以通过LocalActivityManager获取子Activity的实例,进而直接调用子Activity的方法进行数据传递,这种方式相对直接但不推荐,因为可能会引发内存泄漏。 - 更推荐使用Intent的Extra参数进行...

    android ActivityGroup的demo

    通常,我们需要在ActivityGroup中维护一个栈结构,记录子Activity的启动顺序,以便正确处理返回事件。 6. **局限性**:尽管ActivityGroup能实现多层级界面,但其存在一些限制,如内存管理复杂、状态保存不完善、API...

    Android开发—使用ActivityGroup来切换Activity和Layout

    Android 开发—使用 ActivityGroup 来切换 Activity 和 Layout Android 开发中,经常需要在不同的 Activity 之间进行切换,并且显示不同的ContentView。为了实现这个功能,我们可以使用 ActivityGroup 来管理不同...

    ActivityGroup应用实例

    6. **异常处理和回退栈管理**:由于ActivityGroup的特殊性,回退栈(back stack)管理可能会比较复杂,需要手动处理回退按钮的事件,以及处理可能的异常情况,如内存泄漏或资源未释放。 7. **升级到Fragment**:...

    ActivityGroup和ViewPager组合实现微信模仿

    对于ActivityGroup的使用,你需要确保正确处理Activity的生命周期,避免内存泄漏和状态恢复的问题。而使用ViewPager时,要注意滑动事件的处理,以及在页面之间共享数据的方法,例如使用ViewModel或者Fragment之间的...

    ActivityGroup(含listview不冲突)

    这种设计可能导致ListView无法正常获取焦点和处理触摸事件,尤其是在子Activity需要响应触摸事件时。 解决ListView与ActivityGroup冲突的一些策略包括: 1. 自定义ListView:你可以创建一个自定义的ListView,重写...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    "Android Gallery+ActivityGroup实现滑动TAB独立Activity"是一种早期的Android开发技术,虽然现在已经被更先进的Fragment所取代,但理解这一模式对于理解Android应用的演化历程以及如何处理旧代码库中的遗留问题仍然...

    ActivityGroup

    每个子Activity都会有自己的回退栈,这意味着当用户按下Back键时,会按照启动顺序返回上一个子Activity。 ### 注意事项 虽然ActivityGroup提供了一种方式来实现多层界面,但它的使用有一些限制和潜在问题: - **...

    统一管理Activity,每个Activity又相对独立

    这意味着子Activity仍然可以拥有自己的布局、事件处理和业务逻辑,而不会受到父ActivityGroup的过多干预。 5. **1.png和W_ActivityGroup**: 这两个文件可能包含了一些示例或图解,例如1.png可能是展示了...

    ActivityGroup Demo

    6. **生命周期管理**:`ActivityGroup`需要处理子Activity的生命周期事件,如创建、销毁、暂停和恢复,以确保正确管理内存和资源。这可能涉及到重写`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop...

    TabHost, ActivityGroup 的使用例子

    TabHost主要用于创建带有标签页的应用界面,而ActivityGroup则允许你在同一个父Activity下管理多个子Activity,使得在不同页面间切换时可以保持状态。下面我们将详细探讨这两个组件以及它们在实际应用中的用法。 **...

    Android之ActivityGroup实现Tab分页标签

    - 当用户在子Activity的菜单中进行操作时,这些操作只会影响当前的子Activity,而不影响其他子Activity或ActivityGroup本身。 5. **现代替代方案** - 随着Android的演进,ActivityGroup的功能已被Fragment和...

Global site tag (gtag.js) - Google Analytics