【问题标题】:How to execute code when Home button is pressed?按下主页按钮时如何执行代码?
【发布时间】:2017-07-05 23:09:04
【问题描述】:

我只想在按下主页按钮(当应用程序发送到后台时)时运行代码。我尝试使用生命周期方法,但问题是它们也会在其他对话框/活动启动时执行。我只想检查应用程序是否发送到后台。我怎样才能做到这一点?

【问题讨论】:

  • 你为什么要这么做?
  • 我有一个受密码保护的活动。如果用户调用此活动,然后单击主页按钮并再次调用应用程序,将显示相同的活动。我想确保如果用户调用此活动,他应该提供他的密码,当他在此活动中并按下主页按钮并再次启动应用程序时,活动必须再次启动并且不显示相同的活动..因为我可以使用密码进入这个活动,然后可以将活动发送到后台,然后如果其他人使用我的手机并启动应用程序,他可以看到受密码保护的活动

标签: android android-homebutton


【解决方案1】:

onOptionsItemSelected(MenuItem item);中,检查点击的项目是否是主页按钮:

编辑:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

【讨论】:

  • sry 不起作用...我只想在按下主页按钮时完成当前活动
  • 你是如何设置你的ActionBar的?贴一些代码,我们也许能更好地帮助你。如果您试图在按下主页按钮时完成当前活动,只需在 case 语句中添加 finish()。
  • 是的,我已经尝试过了,但是没有用。它没有检测到主页按钮事件。覆盖 onUserLeaveHint() 对我有用
  • 您必须在设置操作栏时指定显示选项,或者类似地使用 getActionBar().setHomeButtonEnabled(true);
  • 动作栏是什么意思?我只想在应用程序发送到后台(单击主页按钮时)运行特定代码。可能我误会你了
【解决方案2】:

Activity.onUserLeaveHint() 会在 Activity 由于用户操作(例如按下主页按钮或切换应用)而进入后台时触发您的 Activity。

【讨论】:

  • 完美,这正是我想要的
  • sry 刚刚检查...它不能正常工作...当另一个活动启动时也会调用此方法
【解决方案3】:

既然您正在编写代码,您可以在显式启动另一个活动时设置一些布尔标志,并检查您的活动何时通过 onPause()...

如果它们是假的,则意味着其他人正在暂停您的活动。

也许不是最优雅的解决方案,但如果这是您唯一遇到的问题,它会起作用。

【讨论】:

  • 我正在使用布尔标志但我不能使用 onePause() 因为 onPause() 也会在我使用应用程序并开始另一个活动时被调用..我不想使用应用程序时始终输入密码,但仅当应用程序被发送到后台并重新启动时
  • 你需要检查onPause()中的布尔值。如果为 false,则您知道另一个 Activity 没有开始。
【解决方案4】:

您可以拥有一个跟踪系统(基本上是一个计数器)来了解您的某个活动何时恢复和暂停,从而让您知道您的任何活动是否处于打开状态。

这样您就可以知道您的应用是否“打开”。但这不仅适用于主页按钮,还适用于后退按钮(最后返回以关闭您的应用),甚至从通知栏中打开另一个应用。

【讨论】:

    【解决方案5】:

    Android 操作系统会杀死您的应用程序以释放资源,它不会一直停留在后台。如果您希望您的应用在后台继续运行,请使用 service

    【讨论】:

    • 什么意思?我不想让我的应用程序在后台运行..我只是在后台发送应用程序时完成我当前的活动(如果单击主页按钮)
    • 我以为你想让你的应用程序在后台运行。你的第一个问题对我来说不够清楚,对不起。现在我明白了你真正想做的事情。好的,把finish();在 onpause() 方法中,因为当用户单击主页按钮时,您的应用程序将调用 onpause() 方法。
    【解决方案6】:

    如果您想在按下主页按钮并且活动进入后台时执行此操作,您可以在活动上覆盖它:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_HOME:
    
        //somthing you want to do
    
        default:
            return super.onKeyUp(keyCode, event);
    
        }   
    }
    

    我正在使用 KeyUp 事件,因为那是应用程序退出的时候,用户可以执行 longPress,我认为您不想在应用程序仍然打开时执行该方法。

    【讨论】:

      【解决方案7】:

      这是一个作弊的答案,但我发现它更可靠。

      当您按下主页按钮时始终调用的一个方法是 surfacedestroyed 方法,用于包含在任何程序活动中的任何 surfaceviews

      将您要执行的代码放在那里,让方法指向您要执行的另一个方法,或者让方法触发一个指向您要执行的方法的标志,这样就可以完成这项工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        相关资源
        最近更新 更多