获取当前运行的活动实例?

9

我想要做的是将运动事件分派到当前正在运行的活动中。我已经从以下代码中获取了当前活动的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)的实例。但我卡在组件名称上了。我该如何获取Activity实例以便分发事件?


1
下次请在格式上多下一些功夫... - Alex Lockwood
1个回答

7

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

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

当前前台活动将获取运动事件,除非它不应该。 我唯一能想象出这个有任何意义的方式是,您的服务已经放置了一个系统窗口,覆盖了所有应用程序...在这种情况下,我建议您不要这样做,只需让前台活动处理事件。

我从这段代码中得到了当前活动的ComponentName

ActivityManager.getRunningTasks()不适用于正常应用程序开发。 这是用于诸如任务管理器之类的东西。 您不应该编写具有依赖于此函数返回的信息的核心程序逻辑。 这是在寻找麻烦,并且事实上,我可以保证这样的代码某些时候会崩溃。 (当多个应用程序同时在前面运行时会发生什么?)

我想分派事件

您真的不应该从一个窗口中取出运动事件并将其塞入另一个窗口中。 各种调度状态将不会正确设置,事件中的状态将不一致(事件是针对原始窗口而非您将其塞入的新窗口设置的),等等。 这是使一个脆弱的应用程序的另一种好方法,该应用程序有很大机会在未来出现故障,即使您今天甚至可以补丁它让它工作。

我卡在组件名称上。 我怎样才能得到Activity实例,以便我可以分派事件?

确实,您只有组件名称。 那与活动实例无关。 不存在将其转换为实际实例的神奇方法。 提供一个是错误的,因为这很容易产生歧义(如果该类的两个实例都存在)。

我认为您需要回到起点,查看您实际要完成什么任务,以获取有关合理方法的帮助。 您已经走上的道路在这一点上非常终结。


谢谢你详细的回答,但是为什么API中会有这些方法呢?肯定有办法可以使用它们。 - Ahmed
像 boolean dispatchGenericMotionEvent(MotionEvent ev) 这样的方法 用于处理通用的触摸事件。 boolean dispatchKeyEvent(KeyEvent event) 用于处理键盘事件。 boolean dispatchKeyShortcutEvent(KeyEvent event) 用于处理快捷键事件。 boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) 用于处理无障碍事件的生成。 boolean dispatchTouchEvent(MotionEvent ev) 用于处理触摸屏幕事件。 boolean dispatchTrackballEvent(MotionEvent ev) 用于处理轨迹球事件。 - Ahmed
1
基本上,我并不在意这种方法有一天会崩溃应用程序的可能性,即使你提到了这些特殊情况,我也必须让它处于运行状态。 - Ahmed
让我给你整个场景。我正在开发 Android 上的鼠标驱动程序,有一个意图服务将建立与鼠标的连接,然后读取来自鼠标的数据,如(x y 坐标数据、左右单击),因此意图服务广播这些数据,另一个服务输入法服务将接收广播消息,从活动管理器获取当前运行的活动并分派运动事件,无论是向左还是向右上下。如果按下键,则向前台活动分派 keydown 事件。 - Ahmed
1
如果您正在开发鼠标驱动程序,您需要通过低级事件系统(从产生事件的内核驱动程序中读取)传递事件,否则它将无法正常工作。分派方法是供ViewGroup类覆盖分派行为的,当事件沿着视图层次结构向下流动时使用;它们不是用于注入新事件的。 - hackbod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接