【问题标题】:Get instance of currently running activity?获取当前正在运行的活动的实例?
【发布时间】:2012-04-25 22:41:42
【问题描述】:

我想要做的是将运动事件分派给当前正在运行的活动。我从这段代码中得到了当前活动的 ComponentName

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

Log.d("current task :", "CURRENT Activity ::" + 
            taskInfo.get(0).topActivity.getClassName());

ComponentName componentInfo = taskInfo.get(0).topActivity;

现在我有了组件名称,我想调度事件

dispatchTouchEvent(MotionEvent ev)

Activity 类中,为此我需要一个当前活动的实例。我被困在组件名称上。如何获取 Activity 实例以便调度事件?

【问题讨论】:

  • 下次请多花点精力格式化您的代码...

标签: android events android-activity


【解决方案1】:

哇,这个问题有很多问题,很难知道从哪里开始!让我们按顺序排列:

我想要做的是将运动事件分派给当前正在运行的活动

当前前台活动将获得运动事件,除非它不应该。我可以想象这有意义的唯一方法是您的服务已经在所有应用程序之上放置了一个系统窗口......在这种情况下,我会敦促您不要这样做,而只是让您的前台活动处理事件。

我已经从这段代码中获得了当前活动的 ComponentName

ActivityManager.getRunningTasks() 用于正常的应用程序开发。这适用于任务管理器等。您永远不应编写依赖于此函数返回的信息的核心程序逻辑。那是自找麻烦,事实上我可以保证这样的代码会在某个时候中断。 (当多个应用程序可以同时在前面运行时会发生什么?)

我要发送事件

你真的,真的不应该将运动事件从一个窗口中提取出来,然后塞进另一个窗口。各种调度状态将无法正确设置,事件中的状态将不一致(事件设置为原始窗口等,而不是您要填充的新窗口)等等。这是另一个如果您甚至可以拼凑起来让它在今天完全正常工作,那么这是制作一个在未来很有可能崩溃的易碎应用程序的好方法。

我卡在组件名称上。如何获取 Activity 实例以便调度事件?

确实,您所拥有的只是一个组件名称。这与活动实例无关。没有神奇的方法可以把它变成一个实际的实例。提供一个是错误的,因为这很容易产生歧义(如果实例化了该类的两个实例)。

我认为您需要从头开始,看看您实际想要完成的工作,以获得有关实现它的合理方法的帮助。你自己走的路在这一点上是相当终点的。

【讨论】:

  • 感谢您的详细解答,但是为什么API中有这些方法,会有办法使用它们
  • boolean dispatchGenericMotionEvent(MotionEvent ev) 等方法被调用来处理通用运动事件。 boolean dispatchKeyEvent(KeyEvent event) 调用来处理按键事件。 boolean dispatchKeyShortcutEvent(KeyEvent event) 调用以处理快捷键事件。 boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) 调用以处理 AccessibilityEvents 的填充。 boolean dispatchTouchEvent(MotionEvent ev) 调用以处理触摸屏事件。 boolean dispatchTrackballEvent(MotionEvent ev) 调用来处理轨迹球事件。
  • 基本上我对这种方法有一天会使应用程序崩溃并不感兴趣,尽管您提到了这些特殊情况,但我必须使其处于运行状态。
  • 让我给你整个场景。我正在android上开发鼠标驱动程序有一个意图服务将建立与鼠标的连接然后从鼠标读取数据(xy坐标数据,左键单击),所以意图服务广播这个数据,另一个服务输入法服务将接收广播消息从活动管理器获取当前正在运行的活动并调度运动事件,无论是左上还是右上或下。如果按键被按下,则 keydown 事件被调度到前台活动。
  • 如果您正在开发鼠标驱动程序,则需要通过低级事件系统传递事件(从产生事件的内核驱动程序中读取),否则将无法正常工作。当事件沿着视图层次向下流动时,ViewGroup 类的调度方法可以覆盖调度行为;它们不是用来注入新事件的。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多