Android - Как поймать, что кнопка Home нажата? - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь поймать, когда пользователь нажал кнопку «Домой».Я думал, что смогу использовать

protected void onResume()
{
   registerReceiver(homeReceiver, new IntentFilter(Intent.CATEGORY_HOME));
}
...
private BroadcastReceiver homeReceiver = new BroadcastReceiver()
       {
          public void onReceive(Context context, Intent intent)
          {
             // logic here
          }
       };

, но это, похоже, не работает.Я понимаю, что будет вызываться onPause, но в моем конкретном приложении есть некоторая логика, которую мне нужно обрабатывать отдельно.Короткая история основана на некоторой информации, поступающей, приложение будет отображать новые действия для пользователя.Чтобы предотвратить проблемы с кнопкой «Назад», когда каждое действие попадает в режим «onStop», оно вызывает «финиш» самостоятельноОднако, если пользователь нажимает кнопку «Домой», я не хочу, чтобы действие завершало вызов, поэтому когда пользователь нажимает значок приложения на домашнем экране или в списке недавно запущенных приложений, возвращается последнее действие.

Я подозреваю, что я сделал это более сложным, чем планировалось.Любые предложения приветствуются.

Ответы [ 6 ]

3 голосов
/ 31 июля 2012

Вы можете следить за жизненным циклом активности.Когда нажата кнопка «Домой», вызывается следующая последовательность методов:

onPause()
onStop()
onRestart()
onStart()
onResume()

Когда вы запускаете новую операцию:

onPause()
onStart()
onResume()
onStop()

Когда вы возвращаетесь из какого-либо действия, которое уже началось:

onPause()
onRestart()
onStart()
onResume()
onStop()
3 голосов
/ 21 февраля 2011

Я плохо знаю английский (из России).Да, вы не можете поймать нажатие кнопки HOME.Единственный способ, который я нашел, это прочитать журнал (logcat) и проанализировать результаты.Когда выполняется действие HOME - в logcat появляется следующая запись:

Начало действия: Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10000000 cmp = com.android.launcher / .Launcher}

U может анализировать эту запись с помощью регулярного выражения.Так что это лучший способ поймать клик на HOME

1 голос
/ 05 ноября 2010

Кнопка «Домой» не может быть переопределена. Вы можете только поймать намерение и показать другой дом, но пользователь всегда сможет выбрать.

Не связывайтесь с тем, как жестко работают кнопки, пользователю нравится постоянное поведение.

0 голосов
/ 10 ноября 2014

Самый простой способ - установить логическую переменную в false, когда вы выходите из этого действия, чтобы перейти к какому-либо другому действию. Затем поместите переменную в true в методе onResume. Проверьте в методе onStop (), не является ли оно ложным, поэтому, если оно истинно, тогда нажимается кнопка Home.

Что-то вроде:

boolean exit=false;

...

//wherever other activity starting
exit=false;
startActivity(activity);

...

@Override
protected void onResume() {
    super.onResume();
    exit=true;
}

...

@Override
protected void onStop() {
    super.onStop();
    if(exit){
        //Home button is pressed
    }
}
0 голосов
/ 06 ноября 2010

Короче говоря, я разочаровался в попытке поймать, что нажата кнопка Home. Я предполагаю, что проблема заключается в завершении (), которое каждый Activity вызывал сам в своем onStop. Поскольку мне по-прежнему нужно вызывать метод finish () для каждого действия, чтобы избежать проблем с кнопками «Назад», я обновил B, чтобы сначала запустить новое действие с помощью startActivityForResult, а затем немедленно вызвать finishActivity для предыдущего действия. Похоже, это решило общую проблему. Теперь, когда я нажимаю кнопку «Домой» и минимизирую приложение, когда я выбираю значок приложения на главном экране или в списке недавно запущенных приложений дома, я получаю правильную активность, которая выводится на передний план.

Теперь мне просто нужно выяснить, почему - иногда - нажатие кнопки «Домой» приводит к остановке моих служб. Но это будет новый вопрос, если я не смогу разобраться. Спасибо всем за ваши идеи.

0 голосов
/ 05 ноября 2010

поведение кнопки, я просто хочу знать, что она нажата, поэтому я могу знать, чтобы не вызывать onFinish, не вызывать onFinish - cbursk

Вы можете переопределить onPause() верно?onFinish() не вызывается, если нажата кнопка возврата ... onFinish() вызывается при нажатии кнопки возврата ... и кнопка возврата может быть отменена с помощью onKeyDown(), например,

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // action goes here
    } else {
        return super.onKeyDown(keyCode, event);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...