【问题标题】:Home button listener主页按钮监听器
【发布时间】:2011-05-06 05:22:06
【问题描述】:

使用 setOnKeyListener 我可以监听除 Home 和 End 按钮之外的所有物理按钮,是否有可能捕捉到 Home 按钮的动作。

【问题讨论】:

  • 我很确定你不能覆盖 Home。为什么要这样做?
  • 在我的应用程序中,我正在阅读一些不应该被任何第三方访问的重要文件,如果我正确退出应用程序,它是不可能的,但是当用户从该活动中按下 Home 时,它​​可以打开我正在搜索的那个活动。
  • 捕获主页按钮的方法无效。您应该遵循 Activity 生命周期,看看当用户按下 Home 按钮时会发生什么。
  • 看到这个答案,可以解决。 stackoverflow.com/a/31340960/6649041
  • @Alex 感谢您的宝贵回复

标签: android


【解决方案1】:

你可以在 Android 4.0+ 上试试这个:
1. 为 Intent.ACTION_CLOSE_SYSTEM_DIALOGS 注册一个 BroadcastReceiver。
2. 调用 Intent.getStringExtra("reason") 获取原因。原因如下:
按下主页键的“homekey”;
长按主页键的“辅助”;

【讨论】:

    【解决方案2】:

    您不需要抓住主页按钮。如果用户按下 Home 并且其他一些 Activity 进入前台,您的应用程序将进入后台并在您当前的 Activity 中调用 onPause()。您可以覆盖该函数以清除搜索字符串或您需要的任何内容。

    更新:

    更干净的解决方案是在开始该关键活动时使用标志 FLAG_ACTIVITY_NO_HISTORY。因此,当您的活动进入后台时,系统会为您正确关闭它。

    【讨论】:

    • 嗨,Zelimir,我在 onStop() 函数中调用了 finish() 函数,所以它可以工作,但它显示对不起,应用程序已意外停止。
    • 第一行应该是 super.onPause();然后你可以调用finish()。如果这没有帮助,请发布错误报告的第一行,其中包含有用的信息为什么会发生。
    • 嗨 Zelimir,onPause() 中的 finish() 在方向更改期间完成了活动,所以我在 onStop() 中给出了它,我很抱歉应用程序意外关闭。
    • 好的,但是你有没有先放 super.onStop() 然后finish()?如果是,请从 LogCat 跟踪中发布错误堆栈的顶部。它应该可以正常工作。
    • 用另一种更干净的方法更新了我的答案。
    【解决方案3】:

    您想使用public boolean dispatchKeyEvent(KeyEvent event),如下所述:http://developer.android.com/reference/android/app/Activity.html#dispatchKeyEvent%28android.view.KeyEvent%29

    像这样使用它:

        @Override
            public boolean dispatchKeyEvent(KeyEvent event)
            {
        // do whatever you want to do here, then return true if you handled the key code
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (event.getKeyCode()) {
                case KeyEvent.KEYCODE_BACK:
                    mBackDown = true;
                    return true;
                case KeyEvent.KEYCODE_HOME:
                    mHomeDown = true;
                    return true;
                }
    }
        return super.dispatchKeyEvent(event);  // let the default handling take care of it
        }
    

    让我知道这是否适合你。

    编辑:不知道为什么这对您不起作用,但是如果不查看您的其余代码,就很难知道到底发生了什么。但是,对于您的任务,我建议您使用 finishOnTaskLaunch 清单属性,如 http://developer.android.com/guide/topics/manifest/activity-element.html#finish 所述:正确使用(将其设置为 true)这将确保如果您的Activity 重新启动,它将关闭任何现有实例。

    【讨论】:

    • 嗨,Femi,它仍然不适用于 Home、End 和 Power 按钮。
    • 奇怪:这对我有用,至少在 Home 和 Back 按钮上是这样。我不确定END按钮:不知道END有一个物理按钮。此外,对于 HOME,您可能需要将 Activity 设为主屏幕(否则我相信 Android 会过滤掉该按键)。而且我不相信您可以捕获电源按钮:在我看来,这将是一个主要的安全问题:有人可能会写一些拒绝让您关闭设备的东西。所以你可能在电源按钮上不走运。
    • 嗨 Femi,我不需要听 End 按钮或 Power 按钮,我只想听 Home 按钮,我只是通知你 Home、End 和 Power 的监听器不是工作。
    • 嗨 Femi,Zelimir 的更新答案对我有用,感谢您的帮助。
    • 来自帮助文档:密钥代码常量:Home 键。此密钥由框架处理,永远不会传递给应用程序
    【解决方案4】:

    这只有在您修改主要的 android 源代码时才有可能。尽管不建议将其用于应用程序目的。但更适合隐藏菜单。

    public static final int KEYCODE_HOME
    
    Since: API Level 1
    Key code constant: Home key. This key is handled by the framework and is never delivered to applications.
    Constant Value: 3 (0x00000003)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2013-07-31
      相关资源
      最近更新 更多