更新[2015年8月]:根据
JM Lord的评论,此答案可能无法按照设备Lollipop及以上的要求进行.见
Alternative to getRunningTasks in Android L
虽然,它的一个旧问题,但绝大多数的答案在我的API 17级及以上级别对我来说无效.我正在回答什么终于为我工作.我尝试了很多方法,但没有一个像今天一样工作.我试过答案
这个要点是,家里就像一个紧急逃生按钮.所以你不能覆盖它,但可以在某些方面检测它.
我尝试的一些(包括上面的答案),没有工作是:
>以多种方式使用keyCode == KeyEvent.KEYCODE_HOME
如上所述.现在,如果你阅读的文件
KeyEvent.KEYCODE_HOME,它说这个键是由
框架,并且不会传递到应用程序.所以没有了
现在有效
>我试过使用onUserLeaveHint().文件说:
Called as part of the activity lifecycle when an activity is about
to go into the background as the result of user choice. For example,
when the user presses the Home key, onUserLeaveHint() will be
called, but when an incoming phone call causes the in-call Activity
to be automatically brought to the foreground.
问题在于,当您启动一个活动时该方法也被调用
从您在UserleaveLint()上调用的活动中,
就像我的情况.详见Android onBackPressed/onUserLeaveHint问题.所以它不确定
只需按主页按钮即可打电话.
>调用onStop().当活动在现有活动之上时也可以被调用,并且完全覆盖它.所以这也不行.
最后以下为我工作:
因此,在您尝试检测主页按钮的活动的onPause()中,您可以检查应用程序是否已发送到后台.
@Override
public void onPause() {
if (isApplicationSentToBackground(this)){
// Do what you want to do on detecting Home Key being Pressed
}
super.onPause();
}
检查您是否是最近发送到后台的应用程序的功能:
public boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
感谢@idish指出,不要忘记在清单中包含以下权限:
我不知道这是否有任何缺点,但对我来说很有用.希望有一天有帮助某人.
P.S:如果在已经使用FLAG_ACTIVITY_NO_HISTORY标志启动的活动中使用此方法,则这将不会有用,因为它会检查最近的历史记录,以确定是否单击“主页”按钮.