正如@j__m 所说,TYPE_KEYGUARD
不再支持。还有许多其他方法已在其他问题上进行了讨论,但在最新的 API 级别中不起作用。我将为您节省精力,并愿意分享我所做的一些搜索、试验和错误。我尝试了很多方法,但在 API 级别 17 中没有一个对我有用。我尝试了答案
在android上按下主页按钮时调用方法,
检测android中的主页按钮按下和
我尝试过的一些(包括上面的答案)但没有奏效的是:
keyCode==KeyEvent.KEYCODE_HOME
如上所述以多种方式使用。现在,如果您阅读
KeyEvent.KEYCODE_HOME的文档,它会说This key is handled by the
framework and is never delivered to applications
. 所以它现在不再有效。
我尝试使用onUserLeaveHint()
. .The documentation says:
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
如果您没有从当前活动中调用任何活动,您正在检测主页按钮,那么您可能可以使用这种方法。这样做的问题是,当您Activity
从您正在调用的活动中启动时,该方法也会被调用onUserleaveLint()
,就像我的情况一样。有关更多信息,请参阅Android onBackPressed/onUserLeaveHint问题。所以它不确定它是否只能通过按下主页按钮来调用。
最后以下对我有用:
查看如何在 Android 中检查当前正在运行的应用程序?,您可以说如果您的任务是长按主页按钮时显示的最近任务,则它被发送到后台。(即按下主页按钮)。
因此,在您onPause()
尝试检测按下的主页按钮的活动中,您可以检查应用程序是否已发送到后台。
@Override
public void onPause() {
if (isApplicationSentToBackground(this)){
// Home button pressed
// 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<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
使用它,我成功地检测到了Home Button
点击。希望这也适用于你。