Метод вызова при нажатии кнопки home на android

Итак, у меня есть этот метод в одном из моих действий в Android:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        Log.d("Test", "Back button pressed!");
    }
    else if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        Log.d("Test", "Home button pressed!");
    }
    return super.onKeyDown(keyCode, event);
}

Но, несмотря на то, что KEYCODE_HOME действителен, метод журнала никогда не срабатывает. Однако это работает для кнопки "Назад". Кто-нибудь знает, почему это так и как заставить это работать?

Спасибо

Ответ 1

Кнопка "Домой" - очень опасная кнопка для переопределения, и поэтому Android не позволит вам переопределить ее поведение так же, как вы делаете кнопку BACK.

Взгляните на это обсуждение .

Вы заметите, что кнопка дома, похоже, реализована как призыв к намерениям, поэтому вам придется добавить категорию намерений в свою деятельность. Затем, в любое время, когда пользователь ударяет по дому, ваше приложение будет отображаться как опция. Вы должны подумать над тем, что именно вы хотите выполнить с помощью кнопки "домой". Если он не заменит начальный экран устройства по умолчанию, я буду опасаться перегрузки кнопки HOME, но это возможно (для обсуждения в приведенном выше потоке.)

Ответ 2

Мне потребовался почти месяц, чтобы пройти через это. Сейчас я решил эту проблему. В вашей деятельности onPause() вы должны включить следующее условие if:

    if (this.isFinishing()){
        //Insert your finishing code here
    }

Функция isFinishing() возвращает логическое значение. Истинно, если ваше приложение действительно закрывается, False, если ваше приложение все еще работает, но, к примеру, экран отключается.

Надеюсь, что это поможет!

Ответ 3

Я обнаружил, что когда я нажимаю кнопку HOME, вызывается метод onStop(). Вы можете использовать следующий фрагмент кода для его мониторинга:

@Override
    protected void onStop() 
    {
        super.onStop();
        Log.d(tag, "MYonStop is called");
        // insert here your instructions
    }

Ответ 4

Кнопка HOME не может быть перехвачена приложениями. Это поведенческое поведение в Android. Причина заключается в том, чтобы запретить злонамеренным приложениям получать контроль над вашим телефоном (если пользователь не может нажать клавишу "Назад" или "домой", он, возможно, никогда не сможет выйти из приложения). Кнопка "Домой" считается пользователем "безопасной зоны" и всегда будет запускать настроенное домашнее приложение пользователя.

Единственное исключение из вышеперечисленного - любое приложение, настроенное как домашняя замена. Это означает, что для соответствующего действия в AndroidManifest.xml указано следующее:

<intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.HOME" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

При нажатии кнопки "домой" будет вызываться текущая активность домашнего приложения onNewIntent.

Ответ 5

KeyEvent.KEYCODE_HOME НЕ может быть перехвачен.

Было бы неплохо, если бы это было возможно.

(Edit): я просто вижу ответ Никса, который полностью завершен;)

Ответ 6

У меня есть простое решение при обращении к домашнему нажатию кнопки. Вот мой код, это может быть полезно:

public class LifeCycleActivity extends Activity {


boolean activitySwitchFlag = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        activitySwitchFlag = true;
        // activity switch stuff..
        return true;
    }
    return false;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override 
public void onPause(){
    super.onPause();
    Log.v("TAG", "onPause" );
    if(activitySwitchFlag)
        Log.v("TAG", "activity switch");
    else
        Log.v("TAG", "home button");
    activitySwitchFlag = false;
}

public void gotoNext(View view){
    activitySwitchFlag = true;
    startActivity(new Intent(LifeCycleActivity.this, NextActivity.class));
}

}

Как сводка, поместите логическое значение в действие, когда произойдет действие переключателя активности (событие startactivity), установите переменную и в событии onpause проверьте эту переменную..

Ответ 7

используйте onPause() метод, чтобы сделать то, что вы хотите сделать на домашней кнопке.

Ответ 8

Я тоже некоторое время боролся с кнопкой HOME. Я хотел остановить/пропустить фоновый сервис (который проверяет местоположение), когда пользователь нажимает кнопку HOME.

вот что я реализовал как "хакерское" решение;

сохранить состояние приложения в SharedPreferences с помощью логического значения

для каждого вида деятельности

onResume() → set appactive = true

onPause() → set appactive = false

и фоновая служба проверяет appstate в каждом цикле, пропускает действие

IF appactive = false

он работает хорошо для меня, по крайней мере, не истощает батарею больше, надеюсь, это поможет....