Android 安卓-如何捕捉按下主页按钮的情况?

Android 安卓-如何捕捉按下主页按钮的情况?,android,Android,我试图捕捉用户何时按下Home(主页)按钮。我想我可以用 protected void onResume() { registerReceiver(homeReceiver, new IntentFilter(Intent.CATEGORY_HOME)); } ... private BroadcastReceiver homeReceiver = new BroadcastReceiver() { public void onReceive(Contex

我试图捕捉用户何时按下Home(主页)按钮。我想我可以用

protected void onResume()
{
   registerReceiver(homeReceiver, new IntentFilter(Intent.CATEGORY_HOME));
}
...
private BroadcastReceiver homeReceiver = new BroadcastReceiver()
       {
          public void onReceive(Context context, Intent intent)
          {
             // logic here
          }
       };
但这似乎不起作用。我知道会调用onPause,但我的特定应用程序有一些逻辑,我需要单独处理。短故事是基于一些信息进来,应用程序将显示新的活动给用户。为了防止后退按钮问题,当每个活动点击它的顶部时,它自己调用finish。但是,如果用户按下Home(主页)按钮,我不希望该活动调用finish(完成),因此当用户按下主屏幕上的应用图标或通过最近运行的应用列表时,会返回最后一个活动


我怀疑我把事情弄得比计划的要复杂。欢迎提出任何建议。

主页按钮无法覆盖。您只能捕捉意图并显示不同的主页,但用户始终可以选择

不要搞乱按钮是如何工作的,用户喜欢一致的行为

按钮行为,我只是想知道 已经按过了,所以我可以知道 不调用onFinish不调用onFinish–cbursk

您可以跳过
onPause()
对吗<代码>onFinish()如果按下home按钮,则不会调用<代码>onFinish()在按下后退按钮时被调用。。。可以使用
onKeyDown()
覆盖后退按钮,如下所示

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // action goes here
    } else {
        return super.onKeyDown(keyCode, event);
    }
}

长话短说,我放弃了试图捕捉正在按下的主页按钮。我假设每个活动在其桌面上调用自己的finish()才是问题所在。由于我仍然需要对每个活动调用finish(),以避免返回按钮问题,因此我更新了B,以首先使用startActivityForResult启动新活动,然后立即对上一个活动调用finishActivity。这似乎解决了整个问题。现在,当我按下Home(主页)按钮并最小化应用程序时,当我从主屏幕或Home(主页)最近运行的应用程序列表中选择应用程序图标时,我会将正确的活动带到前台

现在我只需要弄清楚为什么有时候按下Home(主页)按钮会导致我的服务停止。但如果我不能弄明白,那将是一个新问题。谢谢大家的想法。

我的英语不好(来自俄罗斯)。 是的,你抓不到主页按钮的点击。我找到的唯一方法是读取日志(logcat)并解析结果。当主活动正在运行时-下一条记录出现在logcat中:

开始活动:Intent{act=android.Intent.action.MAIN cat=[android.Intent.category.HOME]flg=0x10000000 cmp=com.android.launcher/.launcher}


你可以用正则表达式解析这个条目。因此,这是我发现的点击主页的最佳方式,您可以监控活动的生命周期。按下home(主页)按钮时,调用以下方法序列:

onPause()
onStop()
onRestart()
onStart()
onResume()
启动新活动时:

onPause()
onStart()
onResume()
onStop()
当您从已开始的某些活动返回时:

onPause()
onRestart()
onStart()
onResume()
onStop()

最简单的方法是,当您退出该活动以进入其他活动时,将布尔变量设置为false。 然后在onResume方法中将变量设置为true。 如果方法onStop()不为false,请检入该方法,如果为true,则按下Home按钮

比如:

boolean exit=false;


对不起,你想在这里完成什么?默认情况下,您拥有您想要的行为。无需劫持后退或主页按钮。较长的故事是活动A启动B,根据传入的数据,B将显示C、D或F。C、D或F的显示可以随着新数据的到来而改变。我希望后退按钮是退出按钮。如果C、D和F在其onStop中未调用finish,则按Back键可返回之前的每个显示。因为我目前无法判断何时按下Home(主页)按钮,所以显示的当前活动将点击其顶部并调用finish(完成)。但是,当用户按下图标返回时,应用程序/Android不会返回到我们停止的位置。你尝试过使用startActivityForResult吗?我尝试过,如果你有任何想法如何利用它对我有利,我欢迎他们。谢谢,我并没有试图覆盖Home按钮的行为,我只是想知道它已经被按下,这样我就可以知道不要调用onfinish了,我已经实现了代码,以捕捉返回并调用活动的finish。诀窍是我有这些活动C、D和F。它们可以被用户导航到或从中导航。让我们先假设B显示C,然后用户转到F,然后是D,F,C,D,C。然后当用户按下后退按钮时,我抓住它并调用finish,在上面的例子中,C消失,D显示,点击后退,C,等等。所以我基本上开始挖这个洞,以避免后退按钮hell,如果你继续打开
活动
,它会像卡片一样堆叠。因此,当您点击顶部活动上的
back
按钮时,它将返回上一步之前打开的活动。。。。就像在你们的例子中,当你们在C中,点击按钮,它会再次显示D,C显示。。。如果您不想这样堆叠,只需在启动活动时放入
finish()
。仅供参考,我发现我的服务停止的原因是因为我使用bindService而不是startService来启动它们。我仍然认为,如果您只需点击Home按钮,这在很大程度上会更容易。这是否一致?我的意思是不同的原始设备制造商可能会改变日志的显示方式。
//wherever other activity starting
exit=false;
startActivity(activity);
@Override
protected void onResume() {
    super.onResume();
    exit=true;
}
@Override
protected void onStop() {
    super.onStop();
    if(exit){
        //Home button is pressed
    }
}