Android 收听主页按钮的按下

Android 收听主页按钮的按下,android,android-homebutton,Android,Android Homebutton,是否有办法监听用户按下Home(主页)按钮 我想覆盖Home按钮功能,但我在许多地方读到“出于安全原因,我们无法覆盖Home按钮”。我们是否可以覆盖“主页”按钮 我尝试过各种代码片段。我从以下站点获取了一个样本: 我在最新的三星J8手机上测试了它,但它不起作用 我的问题是我们能覆盖主按钮还是不能 答:由于android 4.0,您不能将home按钮作为非系统应用覆盖 但是,有一些方法可以听用户是否按下了home按钮。如果您对此感兴趣,我将为您提供一些解决方案 编辑:添加一些解决方案,以收

是否有办法监听用户按下Home(主页)按钮

我想覆盖Home按钮功能,但我在许多地方读到“出于安全原因,我们无法覆盖Home按钮”。我们是否可以覆盖“主页”按钮

我尝试过各种代码片段。我从以下站点获取了一个样本:

我在最新的三星J8手机上测试了它,但它不起作用

我的问题是我们能覆盖主按钮还是不能

答:由于android 4.0,您不能将home按钮作为非系统应用覆盖

但是,有一些方法可以听用户是否按下了home按钮。如果您对此感兴趣,我将为您提供一些解决方案


编辑:添加一些解决方案,以收听主页按钮按下

我提供给你们两种方法来收听主页按钮按下事件。 首先,重新启动广播接收器

class HomeKeyBroadCastReceiver extends BroadcastReceiver {
      final String SYSTEM_DIALOG_REASON_KEY = "reason";
      //press Home button
      final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
      //press recent app button
      final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
      // long press home button
      final String SYSTEM_DIALOGS_REASON_LONG_PRESS_HOME_KEY = "globalactions";
      @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) {
                  if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                      //  press home , do something

                  } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                      //  press recent app , do something

                  } else if (reason.equals(SYSTEM_DIALOGS_REASON_LONG_PRESS_HOME_KEY)) {
                      //  long press home button , do something
                  }
              }
          }
      }
  }

  // register Receiver
  AppUtils.context.registerReceiver(homeKeyBroadCastReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
另一种方法是,您可以在应用程序中注册生命周期回调

application.registerActivityLifecycleCallbacks(new HomeButtonListerLifecycleCallbacks());

  public class HomeButtonListerLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
      // check threshold
      private final int CHECK_DELAY = 200;

      private Handler handler;
      private Runnable checkRunnable;

      public HomeButtonListerLifecycleCallbacks() {
          this.handler = new Handler(Looper.getMainLooper());
      }

      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
          ZZLocalPushInfoManager.getInstance().onCreateActivity(activity);
      }

      @Override
      public void onActivityStarted(Activity activity) {

      }

      @Override
      public void onActivityResumed(Activity activity) {
          if (handler != null && checkRunnable != null) {
              handler.removeCallbacks(checkRunnable);
          }
      }

      @Override
      public void onActivityPaused(final Activity activity) {
          if (handler != null) {
              if (checkRunnable != null) {
                  handler.removeCallbacks(checkRunnable);
              }
              handler.postDelayed(checkRunnable = new Runnable() {
                  @Override
                  public void run() {
                      // Here user has left your app. mostly they pressed home button,
                      // but they also can go to other app by notification,etc.
                  }
              }, CHECK_DELAY);
          }
      }

      @Override
      public void onActivityStopped(Activity activity) {

      }

      @Override
      public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

      }

      @Override
      public void onActivityDestroyed(Activity activity) {

      }
  }

选中此项:@Siva您不能简单地覆盖主页按钮。方法是创建一个“Launcher应用程序”,它相对复杂,需要用户采取特殊步骤才能正确安装。而且链接的代码永远不会起作用-我想它可能在2012年编写时就起作用了,但功能早就被删除了。是的,请建议第一块代码是您刚刚教给我的一个很棒的技巧-谢谢!它不会覆盖,但至少会侦听。第二块并没有说明用户如何离开应用程序(即HOME vs BACK)——它只是说用户“确实离开了”应用程序。