如何检测"最近的应用程序"系统按钮点击(Honeycomb +)

Gre*_*aue 27 user-interface android button android-3.0-honeycomb android-4.0-ice-cream-sandwich

我想知道这个按钮调用的方法.

在此输入图像描述

我的游戏总是暂停/继续正常除当我使用这个按钮,它看起来像这个按钮不会调用onPause()onResume()一个方法活动.它可以工作,如果我退出游戏,转到另一个窗口(如图片中的那个),然后使用此按钮恢复.但是,如果我只是按下这个按钮,当游戏时,游戏暂停,但线程dosnt恢复就像它每隔一段时间一样,游戏类型只是停留在屏幕上并且有点闪烁.

很难解释,但我希望我有点清楚,如果没有,请问!

Hit*_*sit 23

按下"最近的应用程序"按钮时,不会调用任何标准的活动生命周期方法.在最近的应用弹出列表后,活动将保持活动状态.通过此列表的半透明左侧部分,您甚至可以观察应用程序动画是否仍在运行,如果您运行的游戏中包含一些无法正确处理此情况的动画.实际上,Google Play中的许多游戏都没有正确处理这种情况,即使是像"愤怒的小鸟"这样的好游戏.

当用户打开"Recent Apps"列表(或从中返回)时,调用唯一的Activity方法是使用boolean参数onWindowFocusChangedhasFocus.当近期的应用方法的用户开放列表onWindowFocusChanged()调用hasFocus等号false,并呼吁用同样的方法hasFocus等于true当用户按下返回在此列表中.

  • 似乎在Android 4.4.4上,当按下最近的应用程序按钮时会调用onPause/onStop. (3认同)
  • 但是如果你在应用程序中打开另一个活动,onWindowFocusChanged也将是假的,因此它不一定有助于知道"最近的应用程序"按钮被点击(现在也称为概述按钮). (3认同)

Kir*_*zin 5

要检测何时按下"最近的应用"按钮,您可以使用辅助功能服务.您需要运行自己的辅助功能服务并接收类型为"TYPE_WINDOW_STATE_CHANGED"的事件并检查事件的类名.

  1. 阅读android开发人员中的辅助功能服务.设置您自己的辅助功能服务,请求用户许可.
  2. 在您的辅助功能服务覆盖方法中 onAccessibilityEvent()
  3. 在此方法中,您将接收AccessibilityEvent event对象,此对象包含有关刚刚在您的设备上发生的事件的所有必要信息.
  4. 我们对ClassName感兴趣.ClassName有时可以为null,所以不要忘记!= null check.最近的应用程序窗口的程序包名称将根据Android的版本而有所不同:

    • 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"字母)

不知道旧设备的类名,但我不认为有人在2017年维护它们;)

所以你会有这样的事情:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.getClassName() == null) 
        return;

    String className = String.valueOf(event.getClassName());

    if (className.equals("com.android.internal.policy.impl.RecentApplicationsDialog")
            || className.equals("com.android.systemui.recent.RecentsActivity")
            || className.equals("com.android.systemui.recents.RecentsActivity")){
        //Recent button was pressed. Do something.
    }
}
Run Code Online (Sandbox Code Playgroud)

我在以下真实设备上进行了测试:LG,Nexus,索尼和虚拟设备:摩托罗拉,三星.

如果有人知道这些班级名称的例外情况,请告诉我.


Lok*_*esh 5

我有同样的问题,我如下解决了这个问题。

注册“ Home”和“ RecentApp”的按钮单击广播

InnerReceiver mReceiver = new InnerReceiver();
IntentFilter mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mReceiver, mFilter);
Run Code Online (Sandbox Code Playgroud)

现在,BroadcastReceiver代码

class InnerReceiver extends BroadcastReceiver {
    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (mListener != null) {
                    if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                        // Home Button click
                    } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                        // RecentApp or Overview Button click
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是不要忘了unregisterReceiver广播接收器