Обнаружение нажатия кнопки `` Домой '' в Android

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

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

Если это не так, есть ли надежный способ узнать, что заставило действие перейти в onPause? То есть можем ли мы определить, было ли это вызвано запуском нового действия или нажатием кнопки возврата / возврата.

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

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

** Обновление **: спасибо @ android-hungry за эту ссылку: https://nishandroid.blogspot.com/

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

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

Тогда следующее событие БУДЕТ запускаться при нажатии кнопки «Домой»:

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

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

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

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

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

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

Обновление: предположительно, этот хакерский метод больше не работает, начиная с Android 4.0.


person Dean Wild    schedule 16.01.2012    source источник
comment
Моя проблема заключалась не в том, чтобы замаскироваться между клавишами возврата и возврата, но я хотел завершить приложение в обоих случаях. Что я и сделал с помощью Activity.onUserLeaveHint().   -  person harism    schedule 16.01.2012
comment
Единственная проблема заключается в том, что onUserLeaveHint () также срабатывает, когда я запускаю действие из указанного действия, я только хочу знать, нажата ли кнопка назад или домой. Спасибо за предложение, хотя   -  person Dean Wild    schedule 16.01.2012
comment
Это правда, но, к сожалению, насколько мне известно, это единственное место, где можно получить любую информацию об использовании Home -key. Это усложняет сбор ложных срабатываний, из многих можно легко распознать, но все же делает простую задачу довольно сложной.   -  person harism    schedule 16.01.2012
comment
Да, я обошел это ранее, установив флаг всякий раз, когда я начинаю действия и проверяя этот флаг в onPause (), чтобы я знал, было ли это вызвано новым намерением или нажатием кнопки homek. Искал более элегантное решение   -  person Dean Wild    schedule 16.01.2012
comment
Обычное приложение может нормально работать, не зная разницы между нажатием кнопки Home и событием паузы. Другими словами, обычно достаточно onPause (). почему ты хочешь сделать это? Если вы предоставите нам больше информации о ваших намерениях, это поможет вам разработать лучшую общую стратегию.   -  person Josh    schedule 16.01.2012
comment
Привет, Джош, мне нужно, чтобы приложение запускалось с нуля каждый раз при его открытии. Так что, если приложение прерывается нажатием клавиши «Назад» - нет проблем. Но если пользователь нажимает домашнюю клавишу, а затем перезапускается, он возобновляется. Я полностью осознаю, что с точки зрения пользовательского опыта это плохо и полностью противоречит жизненному циклу приложения Android, но, к сожалению, мой клиент этого хочет, и он не сдвинется с места.   -  person Dean Wild    schedule 16.01.2012
comment
В этом так много всего плохого, что я не знаю, с чего начать. 1) Есть много способов попасть в приложение (например, вернуться к нему после ответа на телефонный звонок), поэтому каждый раз, когда оно открывается, не имеет смысла, если вы не определите все эти переходы. 2) Вы говорите, что хотите достичь своей стратегии постоянного перезапуска, убивая приложение каждый раз, когда оно не отображается на экране? 3) Как различие между Home и Back (или любым другим событием onPause) помогает вашему делу?   -  person Josh    schedule 16.01.2012
comment
4) Ваш клиент может думать, что он хочет, чтобы приложение все время перезапускалось с нуля, но он, вероятно, просто не знает, как работают мобильные приложения.   -  person Josh    schedule 16.01.2012
comment
Не хочу показаться грубым, просто пытаясь указать на потенциальные недостатки и, надеюсь, убедить вас, что вы идете по ложному пути.   -  person Josh    schedule 16.01.2012
comment
1) Каждый раз, когда приложение запускается с его значка, оно должно начинаться с нуля. Поэтому, если он возвращается после телефонного разговора и т. Д., Он может возобновиться в обычном режиме. 2) Нет, я хочу убить приложение, когда нажата задняя часть и когда нажата клавиша «Домой», а НЕ когда я запускаю новое действие. 3) Мне не нужно различать дом и обратно, мне нужно различать между домом / возвращением и новыми намерениями - если пауза вызвана новым намерением, Я НЕ хочу заканчивать действие - если это вызвано backbutton или home key Я ДЕЙСТВИТЕЛЬНО хочу завершить действие.   -  person Dean Wild    schedule 16.01.2012
comment
4) Действительно, и это приложение должно отражать пиксель приложения iPhone на пиксель. Так что у меня есть кнопки возврата на экран и т. Д., Это кощунственно, но я не могу их убедить в обратном.   -  person Dean Wild    schedule 16.01.2012
comment
@DeanWild: ты читал это: nisha113a5.blogspot.com   -  person Pratik Bhat    schedule 16.01.2012
comment
Ха-ха, хорошо, по крайней мере, мы знаем, что ты сейчас не сумасшедший. Ознакомьтесь с моим другим ответом, чтобы узнать о возможных решениях.   -  person Josh    schedule 16.01.2012
comment
@android_hungry - я ошеломлен, но это действительно работает.   -  person Dean Wild    schedule 16.01.2012
comment
@DeanWild: я отправлю этот ответ, чтобы другие сочли его полезным! ваше здоровье   -  person Pratik Bhat    schedule 16.01.2012
comment
он не работает в ICS   -  person sravan    schedule 19.08.2013
comment
Это больше не работает с 4.0. Последний комментарий к этому сообщению: groups.google.com/forum / #! topic / android-developers / trRI99-HszQ   -  person japino    schedule 14.11.2013
comment
Константа TYPE_KEYGUARD была удалена из WindowManager.LayoutParams в Android 5.0   -  person theb1uro    schedule 15.02.2015


Ответы (17)


Для меня работает следующий код :)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mReceiver = new InnerReceiver();
    }

    public void startWatch() {
        if (mReceiver != null) {
            mContext.registerReceiver(mReceiver, mFilter);
        }
    }

    public void stopWatch() {
        if (mReceiver != null) {
            mContext.unregisterReceiver(mReceiver);
        }
    }

    class InnerReceiver extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    void onHomePressed();
    void onHomeLongPressed();
}
person Jack    schedule 15.01.2015
comment
Ваш onHomeLongPressed фактически соответствует открытию активности системы Недавние. На моем телефоне это запускается нажатием кнопки недавних событий рядом с кнопкой «Домой», поэтому предположение вашего кода о том, что это долгое нажатие «домой», не всегда верно. - person Sam; 15.05.2015
comment
почему это не работает для меня, я сделал то же самое, за исключением того, что зарегистрировал трансляцию через манифест. - person Farhan; 02.06.2015
comment
Прописал в класс приложения, Работает пока .. +1, интересно в чем прикол? Я имею в виду, какой оригинальный футляр мы бы упустили ..: ^) - person Farhan; 02.06.2015
comment
иногда intent.getStringExtra (SYSTEM_DIALOG_REASON_KEY); вернуть null. Хотелось бы знать, что происходит ?? - person Fakher; 10.02.2016
comment
По-прежнему работает нормально, но для тех, кому интересно, LONG_PRESS обрабатывается немного по-другому. - person Shark; 04.03.2016
comment
Можно ли это сделать из сервиса при заблокированном экране? Этот код использует фильтр ACTION_CLOSE_SYSTEM_DIALOGS, который не работает, пока экран выключен. - person Rosenpin; 02.09.2016
comment
Мне удалось это сделать, запустив фиктивную активность и показав ее на экране блокировки, это не идеально, но работает для моих нужд. - person Rosenpin; 02.09.2016
comment
У меня та же проблема, что и у @Fakher. Моя IDE даже не показывает ее в подсказках. - person DBX12; 19.09.2016
comment
Причина длительного нажатия теперь называется final String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist" - person JWqvist; 29.09.2016
comment
Большое спасибо. Он работает, просто добавьте voiceinteraction при длительном нажатии. - person Chirag Savsani; 13.06.2017
comment
Большой! Работает! Спасибо! - person Reaz Murshed; 28.07.2017
comment
Он отлично работает на всех устройствах, кроме устройств Samsung (например, Samsung J7). Кто-нибудь знает конкретную причину или решение? - person buzzingsilently; 08.09.2017
comment
Оно работает. Потрясающие. Это может обнаруживать домашнее и недавнее нажатие на меню приложений из любого приложения. - person Ajay Shrestha; 25.10.2017
comment
Омг, спасибо. Я смог заставить реагировать на нативный модуль из этого! Дайте мне знать, если вы хотите внести свой вклад. npmjs.com/package/react-native-home-pressed - person evanjmg; 24.02.2018
comment
Абсолютно блестящий! - person Philipp Cherubim; 15.11.2018
comment
Идеальное решение и для меня, спасло мне день :) - person Ramkesh Yadav; 18.12.2018
comment
Хорошо, он обнаруживает нажатие на кнопку «Домой», но это не мешает перейти на главный экран (трамплин) ... Есть ли решение, чтобы избежать возврата к трамплину? С уважением. - person Regis_AG; 26.02.2019
comment
Это решение работает. Но это не мешает приложению уйти в фоновый режим. Как мне этого избежать? - person user2511882; 14.05.2019
comment
Он работает, но как я могу предотвратить закрытие приложения при нажатии кнопки домой? - person Ferchi; 01.07.2019
comment
@Ferchi: Вы нашли решение, как предотвратить закрытие приложения? - person KMC; 12.09.2019
comment
Большое спасибо, работает как шарм. Однако для навигации с помощью жестов на Android Q onHomeLongPressed срабатывал вместо onHomePressed при смахивании вверх до дома. Я использовал этот ответ (stackoverflow.com/questions/56689210/) для обходного пути, определения того, какой тип навигации используется, и соответствующих действий. Думал, что это может быть полезно для некоторых. - person Jorn Rigter; 05.08.2020
comment
работал и у меня B) - person Robillo; 04.12.2020

Это старый вопрос, но он может кому-то помочь.

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

Согласно документации, метод onUserLeaveHint () вызывается, когда пользователь нажимает кнопку «Домой» ИЛИ когда что-то прерывает работу вашего приложения (например, входящий телефонный звонок).

У меня это работает .. :)

person AL̲̳I    schedule 07.07.2015
comment
Неправильно !!! Это работает при нажатой домашней кнопке, но также работает, когда Swiching Activity with Intent !! - person Nikunj Paradva; 10.09.2016
comment
Это всегда будет выполняться перед onStop (), даже если другое действие происходит сверху или пользователь принудительно покидает действие или нажимает кнопку домой ... - person Navas pk; 17.11.2018

Невозможно обнаружить и / или перехватить кнопку HOME из приложения Android. Это встроено в систему для предотвращения вредоносных приложений, из которых невозможно выйти.

person Jave    schedule 16.01.2012
comment
проверьте принятый ответ, возможно. Однако еще не тестировался на многих устройствах. - person Dean Wild; 16.01.2012
comment
Ага ... у меня разбилось приложение. - person Jeremy Logan; 17.10.2013
comment
как насчет пусковых установок / приложений для замены дома? Я создаю один и хочу перейти к первому экрану, когда пользователь нажимает кнопку «Домой». - person lisovaccaro; 08.01.2015
comment
Для пусковых установок используйте это: @Override protected void onNewIntent (намерение намерения) {super.onNewIntent (намерение); /*Делай что хочешь*/ } - person Ton; 13.03.2015
comment
Панель запуска @lisovaccaro и / или домашние замены все еще не поддерживаются Google (src diane hackborn), и поэтому вы не можете запретить пользователю нажимать кнопку Home. Вы все равно можете добавить свое представление в виде диалогового окна системных предупреждений, которое будет перекрывать все. Но нажатия кнопки домой будут проходить через это. - person JacksOnF1re; 23.03.2015

Мне нужно было запускать / останавливать фоновую музыку в моем приложении, когда первое действие открывается и закрывается или когда какое-либо действие приостанавливается кнопкой домой, а затем возобновляется из диспетчера задач. Остановка / возобновление чистого воспроизведения в Activity.onPause() и Activity.onResume() на некоторое время прервала воспроизведение музыки, поэтому мне пришлось написать следующий код:

@Override
public void onResume() {
  super.onResume();

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

который прерывает воспроизведение только тогда, когда приложение (все его действия) закрыто или когда нажата кнопка домой. К сожалению, мне не удалось изменить порядок вызовов onPause() метода начального действия и onResume() запущенного действия при вызове Activity.startActivity() (или обнаружить в onPause(), что действие запускает другое действие другим способом), поэтому этот случай должен обрабатываться специально :

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

Другой недостаток заключается в том, что для этого требуется GET_TASKS разрешение, добавленное к AndroidManifest.xml:

<uses-permission
  android:name="android.permission.GET_TASKS"/>

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

person Blackhex    schedule 14.03.2013

Заменить onUserLeaveHint() в действии. Никогда не будет никакого обратного вызова для действия, когда над ним появится новое действие или пользователь нажмет кнопку возврата.

person Napolean    schedule 21.04.2014
comment
он также вызывается при переходе от одного действия к другому в приложении. - person Amir Uval; 25.03.2015

onUserLeaveHint ();

переопределить этот метод класса активности. Это обнаружит нажатие клавиши Home. Этот метод вызывается непосредственно перед обратным вызовом onPause () активности, но он не будет вызываться, когда действие прерывается, например, действие вызова выходит на передний план, за исключением тех прерываний, которые он вызывает, когда пользователь нажимает кнопку Home.

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.d(TAG, "home key clicked");
}
person Basheer Kohli    schedule 06.10.2017

Начиная с API 14, вы можете использовать функцию onTrimMemory() и проверять наличие флага TRIM_MEMORY_UI_HIDDEN. Это сообщит вам, что ваше приложение переходит в фоновый режим.

Итак, в своем пользовательском классе Application вы можете написать что-то вроде:

override fun onTrimMemory(level: Int) {
    if (level == TRIM_MEMORY_UI_HIDDEN) {
        // Application going to background, do something
    }
}

Для более глубокого изучения этого я предлагаю вам прочитать эту статью: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have-to/

person Renaud C.    schedule 12.03.2019
comment
Хорошая статья - полезная альтернатива, которая, вероятно, делает то, что нужно большинству людей - person Dean Wild; 13.03.2019
comment
Хорошее решение. Вы знаете, как сбросить флаг, когда приложение возвращается из фона? Например, если я создаю логическое значение isInBackground, я бы хотел сбросить его до значения, когда мы вернемся из фона. - person MikeOscarEcho; 31.07.2019

Попробуйте создать счетчик для каждого экрана. Если пользователь коснется HOME, счетчик будет равен нулю.

public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}
person lalosoft    schedule 14.08.2012
comment
Если вы имеете в виду глобальный счетчик приложения, он будет равен нулю в момент, когда одно действие перемещается в задний стек, а другое перемещается наверх, или когда верхнее действие завершено, а активность заднего стека перемещается наверх, что является обычным местом, когда вы хотите реагировать на нажатие кнопки «Домой». Если вы имеете в виду счетчик активности, он будет обнулен каждый раз, когда активность не отображается (не обязательно из-за нажатия кнопки «Домой»). Единственное решение - отложить реакцию с помощью таймера, чтобы пропустить этот переход, но необходимая задержка может быть непредсказуемой или нежелательной. - person Blackhex; 15.03.2013

Вы можете рассмотреть решение Андреаса Шрейда в его сообщении на Как создать рабочий режим киоска в Android. Это немного взломано, но, учитывая причины, по которым предотвращается перехват кнопки Home, так и должно быть;)

person Vito    schedule 28.07.2015

У меня была эта проблема, и поскольку переопределение метода onKeyDown () ничего не дало, потому что базовая система Android не вызывала этот метод, я решил это переопределением onBackPressed (), и у меня было логическое значение, установленное там на false , потому что я нажал "назад", позвольте мне показать вам, что я имею в виду в коде:

import android.util.Log;
public class HomeButtonActivity extends Activity {
    boolean homePressed = false;
    // override onCreate() here.

    @Override
    public void onBackPressed() {
        homePressed = false; // simply set homePressed to false
    }

    @Overide
    public void onResume() {
        super.onResume();
        homePressed = true; // default: other wise onBackPressed will set it to false
    }

    @Override
    public void onPause() {
        super.onPause();
        if(homePressed) { Log.i("homePressed", "yay"); }
    }

Итак, причина, по которой это сработало, заключается в том, что единственный способ выйти за пределы этого действия - нажать назад или домой, поэтому, если была нажата кнопка возврата, я знаю, что причина не в доме, но в противном случае причина была в доме, поэтому я установил логическое значение по умолчанию значение для homePressed, чтобы быть правдой. Однако это будет работать только с одним экземпляром действия в вашем приложении, потому что в противном случае у вас будет больше возможностей вызвать метод onPause ().

person Moshe Rabaev    schedule 30.07.2015
comment
на самом деле, когда вы переходите к другому действию, вызывается метод onpause - person Fakher; 05.02.2016
comment
Вот почему я прямо заявил, что это будет работать только в том случае, если ваше приложение включает только одно действие! - person Moshe Rabaev; 07.02.2016
comment
А что, если одновременно выполняется несколько несвязанных действий, и пользователь просто переключается между ними? Современные устройства Android поддерживают многозадачность. С этим кодом похоже, что переключение обратно в ваше приложение установит для homePressed значение true, а затем переключение на другое приложение будет думать, что Home была нажата, хотя на самом деле это не так. - person Remy Lebeau; 27.10.2016

введите описание изображения здесь Android Home Key обрабатывается уровнем фреймворка, вы не можете справиться с этим на уровне уровня приложения. Потому что действие кнопки «Домой» уже определено на нижнем уровне. Но если вы разрабатываете свой собственный ROM, это может быть возможно. Google ограничил функции переопределения HOME BUTTON из соображений безопасности.

person Stephan John    schedule 27.09.2019

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

Подробнее:

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

person ademar111190    schedule 16.01.2012
comment
интересная идея, но немного затянувшаяся и не такая элегантная, как я бы надеялся - person Dean Wild; 16.01.2012

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

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

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

person Josh    schedule 16.01.2012
comment
Это могло бы показаться наиболее элегантным решением, но я считаю его весьма ненадежным. После нескольких циклов открытия / закрытия / паузы приложение просто возобновит работу, а не перезапустится полностью. - person Dean Wild; 16.01.2012

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

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

person Andi Jay    schedule 18.07.2012
comment
Вы абсолютно правы, но некоторые клиенты не принимают отрицательный ответ и не понимают, почему они не должны нарушать правила. - person Dean Wild; 20.07.2012
comment
Проблема в том, что даже если вы не хотите изменять поведение кнопки «Домой», вам иногда приходится по-разному реагировать на ситуацию, когда приложение перемещается назад из-за нажатия кнопки «Домой», иначе, чем в ситуации, когда текущая активность приостановлена ​​на какое-либо причина. Та же проблема связана с тем, что Application.onDestroy () нельзя использовать для сборки сборки. Такими примерами являются приостановка игры, когда пользователь скрывает приложение, остановка фоновой музыки и т. Д. - person Blackhex; 14.03.2013

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

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

Это сработало отлично. знак равно

person Alexander Cavalheiro Becker    schedule 26.11.2018

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

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

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()
                }
            }
        }
    } 
}
person Aditya    schedule 27.03.2019

У меня это работает. Вы можете переопределить метод onUserLeaveHint https://www.tutorialspoint.com/detect-home-button-press-in-android

@Override
    protected void onUserLeaveHint() {
        //
        super.onUserLeaveHint();
    }
person Tomasz Kot    schedule 16.08.2020
comment
Это работает только тогда, когда в вашем приложении есть только одно действие. Если у вас несколько действий, это не сработает, т.к. при переключении на другое действие этот метод также срабатывает. Нехорошо. - person Josi; 28.01.2021
comment
это также не работает, если вы запускаете намерения галереи и тому подобное. - person rm8x; 06.02.2021
comment
это также было предложено в качестве ответа на этот вопрос в 2017 году. - person rm8x; 06.02.2021