2010-11-04 72 views
2

我想赶上当用户已经按下主页按钮。我以为我可以使用Android - 如何捕捉主页按钮被按下?

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会被调用,但是我的特定应用程序有一些我需要单独处理的逻辑。短故事基于一些信息进入,应用程序将向用户显示新活动。为了防止后退按钮问题,当每个活动命中它的onStop它调用完成本身。但是,如果用户按下主页按钮,我不希望活动调用完成,以便当用户在主屏幕上按下应用程序图标或通过最近运行的应用程序列表时,最后一个活动被取消。

我怀疑我做了这个复杂得多计划。任何建议表示赞赏。

+0

对不起你是什么试图在这里完成?默认情况下,你有你似乎想要的行为。无需劫持后面或家庭按钮。 – schwiz 2010-11-04 21:24:55

+0

更长的故事是活动A启动B,这取决于传入的数据将显示C,D或F. C,D或F的显示可以在新数据进入时更改。我想要“后退”按钮成为退出按钮。如果C,D和F在onStop中没有完成调用,那么按下Back可以循环返回前一个显示。由于我目前无法分辨何时按下主页按钮,因此当前显示的活动会触及其onStop并调用完成。但是,当用户按下图标返回应用时,Android不会回到我们离开的位置。 – bursk 2010-11-04 21:54:27

+0

你尝试过使用startActivityForResult吗? – schwiz 2010-11-04 22:32:57

回答

0

长话短说是我放弃了尝试赶上主页按钮被按下。我假设它是完成(),每个活动在onStop上调用本身,这是问题。由于我仍然需要在每个Activity上调用finish()以避免后退按钮问题,所以我更新了B,首先使用startActivityForResult启动新Activity,然后立即在前一个Activity上调用finishActivity。这似乎解决了整体问题。现在,当我按主页按钮并最小化应用程序时,当我从主屏幕或主页的最近运行的应用程序列表中选择应用程序的图标时,我将正确的活动带到前台。

现在我只需要弄清楚为什么 - 有时 - 按Home按钮导致我的服务停止。但是,如果我无法弄清楚这将是一个新问题。感谢大家提出你的想法。

+0

Just和FYI,我发现我的服务停止的原因是因为我使用bindService来启动它们而不是startService。 – bursk 2010-11-08 17:39:28

+1

我仍然认为,如果您只需点击主页按钮,很多情况会更轻松。 – bursk 2010-11-08 17:39:49

1

主页按钮不能被覆写。您只能捕捉意图并显示一个不同的家,但用户将始终可以选择。

不要乱用多么艰难按钮的工作这么多,用户喜欢一致的行为。

+3

我不是想覆盖主页按钮的行为,我只是想知道它已被按下,所以我可以知道不会打电话onFinish – bursk 2010-11-05 02:03:57

0

按钮的行为,我只是想知道 其已被按下,所以我可以知道 不叫onFinishnot叫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); 
    } 
} 
+0

我已执行该代码以捕获后台并在该Activity上调用完成。诀窍是我得到了这些活动C,D和F.他们可能会被用户导航。因此,让我们说第一个B显示C,然后用户转到F,然后是D,F,C,D,C。然后,当用户按下后退按钮时,我抓住它并调用完成,在上面的示例C中消失, D显示,回击,C等等。 – bursk 2010-11-05 09:41:02

+0

因此,我基本上已经开始挖这个洞,以避免后退按钮地狱 – bursk 2010-11-05 10:04:01

+0

如果你继续打开一个“活动”,它将像卡片一样堆叠。所以当你点击顶部活动的'back'按钮时,它会返回1步到最后一个打开的活动....就像你的情况一样,当你在C中时,点击按钮,它会显示D.回来, C显示...如果你不想像这样堆栈,只需在启动一个活动时加上'finish()'。 – 2010-11-08 07:44:21

2

我不是英语(俄罗斯)好。 是的,你不能赶上主页按钮点击。我发现的唯一方法是读取log(logcat)并解析结果。当HOME活动正在运行时 - 下一条记录出现在logcat中:

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

U可以通过正则表达式解析此条目。所以,这是我发现点击主页的最佳方式

+0

任何人都可以为此添加一些代码吗? – 2013-03-13 13:25:18

+0

这是一致的吗?我的意思是不同的OEM可能会改变日志的显示方式。 – 2015-02-16 11:51:41

3

您可以监控活动的生命周期。当按下下面的方法序列的主页按钮被称为:

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

当你开始一个新的actvity:

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

当您从一些活动回来已经开始:

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

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

喜欢的东西:

boolean exit=false; 

...

//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 
    } 
}