收听“主页”按钮按下

时间:2018-08-16 12:07:53

标签: android android-homebutton

有没有办法听用户按下“主页”按钮?

我想覆盖“主页”按钮功能,但是我在很多地方都读到“出于安全原因,我们不能覆盖“主页”按钮”。我们可以覆盖“主页”按钮吗?

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

我在最新的Samsung J8 Phone中对其进行了测试,但无法正常工作。

1 个答案:

答案 0 :(得分:1)

  

我的问题是我们可以覆盖主页按钮还是不能?

答案:自android 4.0起,您不能将主屏幕按钮改写为非系统应用。

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


编辑:添加一些解决方案以监听主页按钮被按下。

我为您提供了两种方法来监听主页按钮按下事件。 首先,重新注册广播接收器。

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) {

      }
  }