如何在安卓系统中打开最近使用的应用菜单?

5
我想启动显示最近使用的应用程序的菜单。
我尝试在按下按钮时查看logcat,希望有一些意图可以启动,但没有运气。
我知道在一些手机上,它是一个专用按钮,并且也可以通过长按主页按钮来发生。有没有办法以编程方式启动它?
编辑:更新标题以更准确

你的标题说模拟,但是你的帖子说你想要实际启动最近使用的应用程序屏幕...那到底是哪个? - bwoogie
我只想启动菜单。这可能涉及模拟按键或使用意图。不确定什么是可能的。 - BoredAndroidDeveloper
看看 base/core/java/android/app/ActivityManager.java 这个文件,我认为可能会有那个东西在里面。不过只是猜测。 - Connor Tumbleson
1
这个问题询问的是同样的事情,但有更好的答案:https://dev59.com/dWYq5IYBdhLWcg3wtCvO - ThunderWiring
3个回答

5
当您按下“最近使用的应用”按钮时,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的更多信息,请阅读此处的源代码


我给了你一个赞 - 但我正在寻找一种在任何设备上都可以做到的方法,这取决于原生安卓。我认为没有一种全局的方法可以在所有设备上进行此操作,除非具有 root 或特殊权限。 - BoredAndroidDeveloper
1
是的,没错。但如果你想找到一种全局的方法,我认为你可以尝试发送一个键盘KeyEvent.KEYCODE_APP_SWITCH来调用RecentsActivity。 - codezjx

3
与@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)上完美运行。 - Tamás Bolvári

1
不,这是不可能的(主要是由于各种奇特的Android操作系统之间处理方式的差异)。但是,您可以获取正在运行的进程列表并制作自己的最近应用程序列表。(也许this answerthis one可以帮助您。)

我担心会出现这种情况。我知道你可以注入主页按钮按下事件。我希望如果你无法通过意图启动它,那么你可以模拟长按主页按钮。 - BoredAndroidDeveloper
我能否将Android版本限制在>3或者>4以上呢? - BoredAndroidDeveloper
恐怕不行。Android 2.x 中有最近使用的应用程序功能(按住主屏幕键),3.x 版本中有一些受限制的功能(无法清除任务),然后在 4.x 版本中出现了完整的功能。不幸的是,这些功能都是由操作系统专属控制的。通过 root 可能可以实现;但我无法确保这方面的经验。 - Cat
我会在这里给出信用,因为我也没有找到解决方法。如果我发现任何相反的情况,我会回复的。 - BoredAndroidDeveloper
@BoredAndroidDeveloper 听起来不错!我总是乐于接受新知识,以证明自己的错误。 - Cat

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