【问题标题】:Listen for Home button press听 Home 键按下
【发布时间】:2018-08-16 12:07:53
【问题描述】:

有没有办法监听用户按下 Home 键?

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

我尝试过各种代码 sn-ps。我从以下站点获取的一个示例:

我在最新的三星 J8 手机中测试过,但没有成功。

【问题讨论】:

  • @Siva 你不能简单地覆盖主页按钮。这样做的方法是创建一个“启动器应用程序”,它相对复杂,需要用户执行特殊步骤才能正确安装。而且该链接代码永远不会起作用 - 我认为它可能在 2012 年编写时就起作用了,但该功能早已被删除。

标签: android android-homebutton


【解决方案1】:

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

回答:从android 4.0开始,你不能将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) {

      }
  }

【讨论】:

  • 是的,请建议
  • 第一个代码块是您刚刚教给我的一个绝妙技巧 - 谢谢!它不会override,但至少会listen。第二个块没有说用户“如何”离开应用程序(即 HOME 与 BACK) - 它只是说用户“确实离开了”应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2012-10-19
相关资源
最近更新 更多