【问题标题】:Android: Programmatically open "Recent Apps" dialogAndroid:以编程方式打开“最近的应用程序”对话框
【发布时间】:2019-09-18 07:21:57
【问题描述】:

我希望能够从我的应用程序中打开“最近使用的应用程序”对话框。这是通过长按主页按钮打开的对话框。我正在为 Android 4.1 或更早版本编程。我通过实现自定义 AccessibilityService 并调用 AccessibilityService.performGlobalAction(GLOBAL_ACTION_RECENTS) 找到了一种方法,但这需要在手机上启用可访问性,这不是很理想。有没有其他方法可以从应用中打开此对话框?

感谢您的帮助!

【问题讨论】:

    标签: android


    【解决方案1】:

    此代码不适用于 Nougat 或更高版本

    可以触发最近的应用活动。

    StatusBarManagerService 实现了一个可以通过反射使用的公共方法。

    您可以使用以下代码:

    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);
    

    玩得开心

    【讨论】:

    • 使用反射通常不是一个好主意,因为不能保证它可以工作,或者将继续在所有版本的 Android 上工作。
    • 如果使用上述代码,请务必将其包装在try / catch
    • 以上代码不适用于Android2.2 & 2.3,有没有其他替代方法可以让它工作。
    • @Sathish 是的,在 Android androidxref.com/2.3.6/xref/frameworks/base/policy/src/com/…) AFAIK 你无法启动它。
    • 这段代码根本不起作用,它显示错误 java.lang.NoSuchMethodException: toggleRecentApps [],如果有人解决了这个问题,请帮忙
    【解决方案2】:

    您无法访问它。但是,自己动手并不难。 getRecentTasks() 方法返回最近运行的应用程序列表。只需获取列表并向其中添加您自己的 UI。

    这样做的一个好处是,至少在旧版本的 Android 上,默认设置只显示大约 8 个应用程序。如果您自己滚动,可以显示任意数量。

    【讨论】:

    • 请记住,某些供应商会修改最近的应用程序对话框,因此您的对话框对于这些用户来说不会看起来相似。
    • @Leonidos 没错,但它是我在不使用AccessibilityService 的情况下能够提出的最佳解决方案。
    • 另请注意,这些 API 仅用于调试。我认为如果使用不当,它们会导致性能问题。谷歌公司不希望开发人员use it in production code
    • 有可能,看看我的回答
    • 不幸的是,该方法自 API 21 起已弃用。请参阅 developer.android.com/reference/android/app/…
    【解决方案3】:

    这可以使用 TOGGLE_RECENTS Intent 来完成。

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

    注意 软件包将根据 Api 级别进行更改。 See here.

    Android 4.1: "com.android.internal.policy.impl.RecentApplicationsDialog"
    Android 4.2 - 4.4: "com.android.systemui.recent.RecentsActivity"
    Android 5.0 - 7.1: "com.android.systemui.recents.RecentsActivity" ("s" letter was added)
    

    【讨论】:

    • 谢谢;这对我来说适用于 Android 5.1.1。但是,生成的活动看起来与普通的 Android 5 不同。另外,我认为您错过了第二行的右括号。
    • 对于某些包更改为 com.android.systemui.recents.RecentsActivity
    • 遇到此问题的原因是:java.lang.SecurityException:权限拒绝:启动 Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS cmp=com.android.systemui/.recents。最近活动
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多