【问题标题】:How do I launch the recent apps menu in android?如何在 android 中启动最近的应用程序菜单?
【发布时间】:2017-06-29 12:22:42
【问题描述】:

我想启动显示最近使用的应用程序的菜单。

我尝试在按下按钮时查看 logcat,希望有一些我可以启动的意图,但没有运气。

我知道在某些手机上它是一个专用按钮,长按主页按钮也可以实现。有什么方法可以以编程方式启动它?

编辑:更新了标题以更准确

【问题讨论】:

  • 你的标题说是模拟,但你的帖子说你想实际启动最近的应用程序屏幕......是什么?
  • 我只想启动菜单。这可能涉及模拟按键或使用意图。不知道有什么可能
  • 给 base/core/java/android/app/ActivityManager.java 看看,我想可能有它。不过只是猜测。
  • 这个问题问同样的问题,但答案更好:stackoverflow.com/questions/14267482/…

标签: android android-intent


【解决方案1】:

当你按下“Recent Apps”按钮时,logcat 会输出如下信息:

568-716/system_process I/ActivityManager﹕ START u0 {act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity} from pid 627
    --------- beginning of /dev/log/main
568-582/system_process I/ActivityManager﹕ Displayed com.android.systemui/.recent.RecentsActivity: +215ms

所以,我们可以通过编程来模拟这个操作。 (不要忘记将标志设置为 0x10800000):

Intent intent = new Intent ("com.android.systemui.recent.action.TOGGLE_RECENTS");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.setComponent(new ComponentName("com.android.systemui", "com.android.systemui.recent.RecentsActivity"));
startActivity (intent);

更多关于RecentsActivity的信息,请阅读源代码here

【讨论】:

  • 我给了你一个赞成票 - 但我正在寻找一种在任何设备上执行此操作的方法,这取决于股票 android。我认为没有 root 或所有设备上的特殊权限,没有全局方法可以做到这一点。
  • 是的,没错。但是如果你想找到一个全局的方式,我认为你可以尝试发送一个键盘 KeyEvent.KEYCODE_APP_SWITCH 来调用RecentsActivity。
【解决方案2】:

就像@Floerm 的帖子一样,这段代码只能在 android N 下工作,android N 已经改变了 IStatusBarService api,我们不能这样访问。

private void openRecentApps() {
try {
    Class serviceManagerClass = Class.forName("android.os.ServiceManager");
    Method getService = serviceManagerClass.getMethod("getService", String.class);
    IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar");
    Class statusBarClass = Class.forName(retbinder.getInterfaceDescriptor());
    Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[]{retbinder});
    Method clearAll = statusBarClass.getMethod("toggleRecentApps");
    clearAll.setAccessible(true);
    clearAll.invoke(statusBarObject);
} catch (Exception e) {
    e.printStackTrace();
}}

如果你想在 Android N 中启动最近的应用,你需要使用 AccessibilityService。

accessibilityService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS);

【讨论】:

  • 在三星 Galaxy S4 (Android 5.0.1) 上完美运行。
【解决方案3】:

不,这是不可能的(主要是因为在各种深奥的 Android 操作系统之间有多种处理方式)。但是,您可以获得正在运行的进程列表并创建自己的最近应用程序列表。 (也许this answerthis one 会帮助你。)

【讨论】:

  • 我担心会是这样。我知道你可以注入主页按钮按下。我希望如果您无法通过意图启动它,那么您可以模拟长按主页按钮。
  • 如果我将android的版本限制为>3甚至>4是否有可能?
  • 恐怕不行。 Android 2.x 中有一个最近的应用程序功能(按住主页按钮),3.x 中有一个有限的功能(没有消除任务),然后是 4.x 中的全功能版本。不幸的是,这些都是由操作系统专门控制的。 可能可以生根;我无法谈论那种经历。
  • 我会在这里表扬,因为我也没有办法做到这一点。如果我发现任何相反的情况,我会回帖
  • @BoredAndroidDeveloper 听起来不错!我总是很高兴被证明是错误的,有利于新知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2011-06-19
相关资源
最近更新 更多