Подтвердить что ты не робот

Как обнаружить клики системы "Недавние приложения" (Honeycomb +)

Мне интересно, какой метод вызывает эта кнопка.

enter image description here

Моя игра всегда приостанавливается/возобновляется правильно, за исключением случаев, когда я использую эту кнопку, кажется, что эта кнопка не вызывает методы onPause() и onResume() Activity. Он работает, если я выхожу из игры, перейдите в другое окно (например, на картинке), а затем снова нажмите эту кнопку. Но если я просто нажимаю эту кнопку, во время игры игра приостанавливается, но поток dosnt возобновляется, как и в любое другое время, игровой вид просто стоит на экране и немного мерцает.

Трудно объяснить, но я надеюсь, что я буду чем-то ясным, если нет, спросите!

4b9b3361

Ответ 1

Ни один стандартный метод Activity Lifecycle не вызывается при нажатии кнопки "Последние приложения". Активность будет активна после появления всплывающих окон последних приложений. Через полупрозрачную левую часть этого списка вы даже можете наблюдать, что анимация приложения все еще работает, если вы запускаете игру с некоторой анимацией, которая не справлялась с этой ситуацией должным образом. На самом деле многие игры в Google Play не справлялись с этой ситуацией должным образом, даже хорошие, такие как Angry Birds.

Единственный метод Activity вызывается, когда пользователь открывает список "Недавние приложения" (или возвращает его) onWindowFocusChanged с логическим параметром hasFocus. Когда пользователь открывает список метода недавнего приложения onWindowFocusChanged(), вызываемый с помощью hasFocus equals false, и тот же метод, который вызывается с hasFocus equals true, когда пользователь нажимает Назад в этом списке.

Ответ 2

У меня возникла аналогичная проблема, поэтому мне нужно было знать, когда пользователь нажимает кнопку последних приложений (кнопка меню в старых версиях Android). после нескольких часов исследований я не нашел событие, которое нужно поймать, когда нажата кнопка "Дом" или кнопка меню. я обнаружил, что для вызова onStop() при нажатии кнопки "домой" требуется больше времени, поэтому я рисую трюк, чтобы отличать эти кнопки буксировки от времени ответа и переопределять два метода:

@Override

public void onUserLeaveHint() {
    // do stuff
    super.onUserLeaveHint();
    userLeaveTime = System.currentTimeMillis() ;
    isNotPower = true;
}

@Override

public void onStop() {
    super.onStop();
    if (isNotPower) {
        defStop = System.currentTimeMillis() - userLeaveTime;
        if (defStop > 200 ) {
            //home button
        }
        if (defStop < 200) {
            //recent apps button
        }
    }
    isNotPower = false;
}
  • параметр isNotPower, который проверяет, не нажата ли кнопка питания, - когда кнопка питания нажата на метод onStop(), но не th onUserLeaveHint().

Ответ 3

Чтобы определить, когда была нажата кнопка "Недавние приложения", вы можете использовать службу специальных возможностей. Вам нужно будет запустить свою собственную службу специальных возможностей и получить события с типом "TYPE_WINDOW_STATE_CHANGED" и проверить имя класса событий.

  • Читайте о службе специальных возможностей в разработчике Android. Настройте свою собственную службу специальных возможностей, попросите разрешения у пользователя.
  • В вашем методе переопределения службы доступности onAccessibilityEvent()
  • В этом методе вы получите объект AccessibilityEvent event, этот объект содержит всю необходимую информацию о событии, которое только что произошло на вашем устройстве.
  • Мы заинтересованы в ClassName. ClassName иногда может быть нулевым, поэтому не забывайте о!= 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.
    }
}

Я тестировал его на следующих реальных устройствах: LG, Nexus, Sony и виртуальных устройствах: Motorola, Samsung.

Если кто-то знает исключение для этих имен классов, пинговать мне.

Ответ 4

Лучший способ, который я нашел, - это прислушаться к широковещательному действию под названием "ACTION_CLOSE_SYSTEM_DIALOGS". Из документов Google:

Трансляция: это широковещательная передача, когда пользовательское действие должно запрашивать временный системный диалог для отклонения. Некоторые примеры временной системы диалоговые окна - это окно окна уведомлений и диалоговое окно недавних задач.

Рабочий код:

IntentFilter intentFilterACSD = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                    //do what you want here
            }
        }
    };
    this.registerReceiver(broadcastReceiver, intentFilterACSD);

Ответ 5

Это только проблема с этой конкретной игрой? Или это с каждой игрой, в которую вы играете?

Помимо onPause() и onResume(), существует еще один цикл, называемый onStop(). Возможно, здесь есть некоторые фундаментальные вещи. При нажатии этой кнопки "окна-открытая" игра, вероятно, не войдет в onStop -state, а нажатие кнопки "home" - это будет.

Ответ 6

попробуйте следующее:

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    Log.d("Focus debug", "Focus changed !");

    if (!hasFocus) {
        Log.d("Focus debug", "Lost focus !");

    }
}