Обнаружить нажатие кнопки домой в Android - PullRequest
80 голосов
/ 16 января 2012

Это уже давно сводит меня с ума.

Есть ли способ надежно определить, была ли нажата кнопка «Домой» в приложении для Android?

В противном случае, существует ли надежный способ сообщить, что послужило причиной перехода активности в onPause?т.е. мы можем определить, было ли это вызвано запуском новой активности или нажатием back / home.

Одно из предложений, которое я видел, это переопределить onPause () и вызвать isFinishing (), но при возврате будет возвращено falseКнопка «Домой» так же, как и в случае запуска нового действия, поэтому не удается различить их.

Любая помощь очень ценится.

** Обновление **: Спасибо @ android-hungryдля этой ссылки: http://nisha113a5.blogspot.com/

Перечисление следующего метода:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

Тогда будет запущено следующее событие для нажатий кнопок home:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
       //The Code Want to Perform. 
    }
});

I 'Я не уверен, есть ли какие-либо побочные эффекты с этой линией:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

Так что может показаться, что вопреки распространенному мнению, вы можете прислушиваться к ключу home.Тревожно, вы можете вернуть false и сделать так, чтобы домашний ключ ничего не делал.

Обновление : Как и ожидалось, есть некоторые побочные эффекты - кажется, что встроенные видео и карты Google не видныс включенным этим режимом.

Обновление : возможно, этот хак больше не работает с Android 4.0 и выше

Ответы [ 16 ]

0 голосов
/ 27 марта 2019

Ответ Джека идеально подходит для события click, в то время как longClick рассматривается как нажатие кнопки menu.

Кстати, если кому-то интересно, как это сделать через kotlin,

class HomeButtonReceiver(private var context: Context,private var listener: OnHomeButtonClickListener) {
    private val mFilter: IntentFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
    private var mReceiver: InnerReceiver = InnerReceiver()

    fun startWatch() {
        context.registerReceiver(mReceiver, mFilter)
    }

    fun stopWatch() {
        context.unregisterReceiver(mReceiver)
    }

    inner class InnerReceiver: BroadcastReceiver() {
        private val systemDialogReasonKey = "reason"
        private val systemDialogReasonHomeKey = "homekey"
        override fun onReceive(context: Context?, intent: Intent?) {
            val action = intent?.action
            if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
                val reason = intent.getStringExtra(systemDialogReasonKey)
                if (reason != null && reason == systemDialogReasonHomeKey) {
                    listener.onHomeButtonClick()
                }
            }
        }
    } 
}
0 голосов
/ 26 ноября 2018

Недавно я пытался обнаружить кнопку домашнего нажатия, потому что мне нужно было сделать то же самое, что и метод " onBackPressed () ".Для этого мне пришлось переопределить метод " onSupportNavigateUp () " следующим образом:

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

Он работал отлично.=)

0 голосов
/ 08 мая 2018

переопределить метод onUserLeaveHint может перехватить событие домашней прессы, но вам также необходимо учитывать события щелчка пользователя.следующие коды работают для меня.

private boolean isUserClickToLeave = false;
private Handler mHandler = new Handler();

 Runnable resetUserClickFlagRunnable = new Runnable() {
    @Override
    public void run() {
        isUserClickToLeave = false;
    }
};

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
        isUserClickToLeave = true;
        mHandler.removeCallbacks(resetUserClickFlagRunnable);
        mHandler.postDelayed(resetUserClickFlagRunnable, 1000);
    }
    return super.dispatchTouchEvent(ev);
}

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    if (!isUserClickToLeave ) {
        //user press home button case.
       onHomePressed();
    }
    isUserClickToLeave = false;
}

private onHomePressed() {
    //do something here.
}
0 голосов
/ 19 июля 2012

Это плохая идея изменить поведение клавиши home.Вот почему Google не позволяет переопределить ключ дома.Я бы вообще не связывался с ключом от дома.Вы должны дать пользователю возможность выйти из своего приложения, если оно по какой-либо причине уходит в сорняки.

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

0 голосов
/ 16 января 2012

Поскольку вы хотите, чтобы корневая активность отображалась только при запуске приложения, возможно, вы можете получить такое поведение, изменив режим запуска и т. Д. В манифесте?

Например, вы пытались применитьатрибут android: clearTaskOnLaunch = "true" для вашей активности запуска, возможно, в тандеме с android: launchMode = "singleInstance" ?

Задачи и НазадСтек - отличный ресурс для тонкой настройки такого поведения.

0 голосов
/ 16 января 2012

Вариант для вашего приложения - написать новый домашний экран с помощью android.intent.category.HOME Intent.Я считаю, что этот тип намерения вы можете увидеть кнопку домой.

Подробнее:

http://developer.android.com/guide/topics/intents/intents-filters.html#imatch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...