Вызов метода, когда нажата домашняя кнопка - PullRequest
51 голосов
/ 24 января 2011

У меня есть этот метод в одном из моих 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 действителен, метод log никогда не срабатывает. Это работает для кнопки назад, хотя. Кто-нибудь знает, почему это так и как заставить это работать?

Ответы [ 9 ]

32 голосов
/ 24 января 2011

Кнопка «Домой» - очень опасная кнопка для переопределения, и поэтому Android не позволит вам переопределить ее поведение так же, как кнопка НАЗАД.

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

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

22 голосов
/ 13 августа 2011

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

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

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

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

12 голосов
/ 24 января 2011

Кнопка 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.

7 голосов
/ 26 марта 2012

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

@Override
    protected void onStop() 
    {
        super.onStop();
        Log.d(tag, "MYonStop is called");
        // insert here your instructions
    }
3 голосов
/ 22 августа 2018

Использование BroadcastReceiver

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // something
    // for home listen
    InnerRecevier innerReceiver = new InnerRecevier();
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    registerReceiver(innerReceiver, intentFilter);

}



// for home listen
class InnerRecevier extends BroadcastReceiver {

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
    final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (reason != null) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                    // home is Pressed
                }
            }
        }
    }
}
3 голосов
/ 24 января 2011

KeyEvent.KEYCODE_HOME НЕ МОЖЕТ быть перехвачен.

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

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

2 голосов
/ 08 октября 2011

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

2 голосов
/ 16 сентября 2011

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

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));
}

}

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

1 голос
/ 01 июня 2011

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

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

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

по каждому виду деятельности

onResume () -> set appactive = true

onPause () -> set appactive = false

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

IF appactive = false

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

...