我要做的是将动作事件发送到当前正在运行的活动。我从这段代码中获得了当前活动的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
实例以便我可以发送事件?
答案 0 :(得分:7)
我要做的是将动作事件发送到当前正在运行的活动
当前前景活动将获得动作事件,除非它不应该。我能想象到这一点的唯一方法就是你的服务已经把一个系统窗口放在所有应用程序之上......在这种情况下,我会敦促你不要这样做,只是让你的前景活动处理事件。
我从这段代码中获得了当前活动的ComponentName
ActivityManager.getRunningTasks()不用于正常的应用程序开发。这适用于任务管理器等。您永远不应该编写依赖于此函数返回的信息的核心程序逻辑。那是乞求麻烦,事实上我可以保证这样的代码会在某些时候中断。 (当多个应用程序可以同时在前面运行时会发生什么?)
我想发送活动
你真的,真的不应该从一个窗口中扯下运动事件并将它们塞进另一个窗口。各种调度状态将无法正确设置,事件中的状态将不一致(事件设置为原始窗口的原点等,而不是您填入的新事件),等等。这是另一个很好的方法可以制作一个很有可能在未来破坏的片状应用程序,如果你甚至可以使它在今天完全有效的话。
我被困在组件名称上。如何获取Activity实例以便我可以调度该事件?
的确,你所拥有的只是一个组件名称。这与活动实例无关。没有神奇的方法可以将其转化为实际的实例。提供一个是错误的,因为这很容易模糊(如果有两个实例化的实例)。
我认为你需要回到起点并看看你实际想要完成的事情,以获得合理的接近方式的帮助。在这一点上,你已经让自己陷入困境的道路非常终端。