8

我想要做的是将运动事件分派给当前正在运行的活动。我从这段代码中得到了当前活动的 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实例以便调度事件?

4

1 回答 1

7

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

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

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

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

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

我要派发活动

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

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

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

我认为你需要从头开始,看看你实际上想要完成什么,以获得帮助,了解什么是接近它的合理方式。在这一点上,你自己走的路是终点站。

于 2012-04-25T23:22:50.013 回答