Обнаружить кнопку HomeButton, нажатую Android до onBackPressed

Я разрабатываю приложение для Android, в котором, когда приложение находится в фоновом режиме, в строке состояния отображается уведомление. Используя onUserLeaveHint, я могу определить, когда пользователь нажимает кнопку HOME, но тот же прослушиватель событий также срабатывает, когда пользователь нажимает кнопку BACK. Как определить только нажатия кнопки HOME?


person Manuel Castro    schedule 16.04.2015    source источник
comment
Вы пытались переопределить onKeyDown и проверить KeyEvent.KEYCODE_HOME?   -  person Breadbin    schedule 16.04.2015
comment
@Breadbin KeyEvent.KEYCODE_HOME не перехватывается в onKeyDown со времен Froyo и Gingerbread.   -  person Royi Benyossef    schedule 16.04.2015
comment
Используйте onTrimMemory(), как предлагается здесь   -  person scr    schedule 10.12.2020


Ответы (4)


Извините, но все предложенные ответы устарели, а некоторые из них совершенно неверны.

Прямой перехват HOME был заблокирован еще на Froyo из-за проблем с безопасностью и боязни вредоносных программ (если вы можете перехватить HOME, вы можете попытаться захватить устройство).

Единственное известное мне решение, которое отделяет BACK от HOME, — это перехватить прослушиватель событий onNewIntent().

onNewIntent() запускается, когда приложение запущено, и получает другое намерение для запуска. Вот почему вы получите его, когда нажмете ДОМОЙ.

При нажатии НАЗАД ваше приложение не получит намерение. Все, что происходит, это то, что приложения поверх ваших удаляются. Таким образом, ваше приложение появляется из заднего стека с вызовом только onResume().

Так вот как вы можете сказать.

Он также упоминается здесь. Удачи.

person Royi Benyossef    schedule 16.04.2015

Когда пользователь нажимает назад, вы должны получить вызов onBackPresssed. Вы можете использовать это, чтобы установить флаг, чтобы во время onUserLeaveHint можно было определить, была ли нажата кнопка «Назад». Не забудьте после этого очистить флаг.

person Tunga    schedule 16.04.2015
comment
Я пробую это решение. Но иногда он вызывает onUserLeaveHint перед onBackPressed, поэтому я не могу установить флаг. - person Manuel Castro; 16.04.2015

Я нашел решение, используя метод onStop() и onResume(). это мой код

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, PagerActivity.class);
    startActivity(intent);
    finish();
}

/* Handle notification create/destroy */
private Boolean notificationCreated = false;

@Override
protected void onStop() {
    Utils.createNotification();
    notificationCreated = true;
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    if (notificationCreated)
    {
        Utils.cancelNotification();
        notificationCreated = false;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (notificationCreated) {
        Utils.cancelNotification();
        notificationCreated = false;
    }
}
person Manuel Castro    schedule 16.04.2015

Вы можете просто деактивировать кнопку «Назад» для этой конкретной страницы. Вот что работает для меня:

@Override
public void onBackPressed() {

}
person Zelalem    schedule 16.04.2015
comment
Переопределение onBackPressed противоречит контрольному списку приложений для Android (developer.android.com/distribute/ essentials/quality/core.html) Приложение не переопределяет ожидаемую функцию системного значка (например, кнопки «Назад»). - person Royi Benyossef; 16.04.2015