2010-11-04 4 views
2

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

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 будет вызываться, но у моего конкретного приложения есть некоторая логика, которую мне нужно обрабатывать отдельно. Краткая история основана на некоторой информации, входящей в приложение, приложение будет отображать новые действия для пользователя. Чтобы предотвратить проблемы с кнопкой «Назад», по мере того, как каждое действие попадает на него, он вызывает завершение сам по себе. Однако, если пользователь нажимает кнопку «Домой», я не хочу, чтобы «Активность» заканчивалась так, что когда пользователь нажимает значок приложения на главном экране или через список запущенных приложений, последняя активность возвращается.

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

+0

Я сожалею, что тыпытаясь сделать здесь? По умолчанию у вас есть поведение, которое вам кажется нужным. Не нужно захватывать задние или домашние кнопки. – schwiz

+0

Более длинная история - это активность A, начинающаяся с B, которая, в зависимости от входящих данных, будет отображать C, D или F. Отображение C, D или F можно изменить по мере ввода новых данных. чтобы быть кнопкой выхода. Если C, D и F не назовут финиш в их onStop, нажмите циклы Back обратно через каждый предыдущий экран. Поскольку в настоящее время я не могу сказать, когда нажата кнопка «Домой», текущая активность отображается на ее конце и заканчивается. Но затем, когда пользователь нажимает значок, чтобы вернуться, приложение/Android не вернется туда, где мы остановились. – bursk

+0

Вы пробовали использовать startActivityForResult? – schwiz

ответ

0

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

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

+0

Просто и FYI, я обнаружил, что мои службы останавливались, потому что я использовал bindService для запуска их вместо startService. – bursk

+1

Я все еще думаю, что это было бы намного проще, если бы вы могли просто нажать кнопку «Домой». – bursk

1

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

Dont mess with how hard buttons работают так много, пользователю нравится последовательное поведение.

+3

Я не пытаюсь переопределить поведение кнопки «Домой», я просто хочу знать, что он был нажат, поэтому я знаю, что не могу называть onFinish. – bursk

0

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

Вы можете overide 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); 
    } 
} 
+0

У меня есть этот код, реализованный, чтобы поймать конец и завершить вызов Activity. Хитрость в том, что у меня есть эти действия C, D и F. Они могут быть перемещены пользователем и от него. Итак, скажем, сначала B отображает C, тогда пользователь переходит к F, затем D, F, C, D, C. Затем, когда пользователь нажимает кнопку «Назад», я поймаю ее и назову закончить, в примере выше C уйдет и D, назад, C и т. Д. – bursk

+0

Итак, я в основном начинаю копать это отверстие, чтобы избежать обратного хода ада – bursk

+0

, если вы продолжаете открывать 'Деятельности', он будет складываться как карта. Поэтому, когда вы нажимаете кнопку «назад» на верхней активности, она вернется на один шаг к активности, открывшейся до последнего ... Как и в вашем случае, когда вы на C, нажмите кнопку, и он отобразит D. Вернитесь снова, C показал ... Если вы не хотите так складываться, просто поставьте 'finish()' при запуске действия. –

2

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

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

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

+0

Может кто-нибудь добавить код для этого, пожалуйста? –

+0

Согласен ли это? Я имею в виду, что разные OEM-производители могут изменить способ отображения журналов. –

3

Вы можете следить за жизненным циклом деятельности.При нажатии кнопки домой нажимается следующая последовательность методов называется:

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

При запуске нового actvity:

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

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

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

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

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

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 
    } 
} 
Смежные вопросы