如何检测用户在我的活动中按HOME键?

n17*_*911 12 android

你能告诉我我的活动如何检测用户HOME按键?

谢谢.

Sho*_*uri 43

更新 [2015年8月]:根据JM Lord的评论,这个答案可能无法满足Lollipop及以上设备的要求.请参阅Android L中的getRunningTasks替代方案


虽然,这是一个老问题,但大多数答案在API级别17及以上版本中对我不起作用.我正在回答最终为我工作的事情.我尝试了很多方法,但没有一个像今天一样工作.我试过答案

在Android上按下主页按钮时的调用方法,

在android和中检测主页按钮按下

覆盖主页按钮 - 如何摆脱选择?.要点是Home就像一个紧急逃生按钮.所以你不能覆盖它,但可以在某些方面检测它.

我试过的一些(包括上面的答案)但没有用的是:

  1. keyCode==KeyEvent.KEYCODE_HOME如上所述以多种方式使用.现在,如果您阅读了KeyEvent.KEYCODE_HOME的文档 ,那就说明了这一点This key is handled by the framework and is never delivered to applications.所以它现在不再有效了.

  2. 我试过用onUserLeaveHint().文件说:

    当活动即将作为用户选择的结果进入后台时,被称为活动生命周期的一部分.例如,当用户按下Home键时,将调用onUserLeaveHint(),但是当传入的电话呼叫导致呼入时Activity自动被带到前台.

    问题在于,当你Activity 从你正在调用的活动中启动一个方法时,也会调用该方法onUserleaveLint(),就像我的情况一样.有关更多信息,请参阅Android onBackPressed/onUserLeaveHint问题.所以它不确定它只能通过按下主页按钮来调用.

  3. 打电话onStop().当活动出现在现有活动之上并完全覆盖它时,也可以调用它.所以这也行不通.

最后,以下内容对我有用:

眼看如何检查当前正在运行的应用程序在Android中?你可以说,如果你的是最近的任务,长按主页按钮显示,然后它被发送到后台.

因此,在您onPause()尝试检测按下主页按钮的活动中,您可以检查应用程序是否已发送到后台.

@Override
public void onPause() {
    if (isApplicationSentToBackground(this)){
        // Do what you want to do on detecting Home Key being Pressed 
    }
    super.onPause();
}
Run Code Online (Sandbox Code Playgroud)

用于检查您的应用是否是最近发送到后台的应用的功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

感谢@idish指出不要忘记在清单中包含以下权限:

<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)

我不确定这是否有任何缺点,但它对我有用.希望有一天能帮助某人.

PS:如果你在使用FLAG_ACTIVITY_NO_HISTORYflag 启动的Activity中使用此方法,那么这将无用,因为它会检查最近的历史记录以确定是否Home单击了按钮.

  • 实际上,如果您的目标是Lollipop,则明确弃用该方法:http://stackoverflow.com/questions/26400469/alternative-to-getrunningtasks-in-android-l (2认同)

小智 12

您可以通过Activity.onUserLeaveHint()检测HOME按钮按下.在两种情况下调用此方法; 当用户按下HOME时以及启动新活动时.确保以某种方式区分两者.

  • 如果当前 Activity 是当前默认启动器,则不会在用户按下 Home 时调用它:) (2认同)

Gra*_*eme 9

没有正式的方式来通知"HOME"按键.但是有一个非常简单的工作,让你的应用程序区分"主页"按键和任何其他可能导致活动停止的操作.

对于需要在"HOME"键上执行某些操作的每个类,按下它们将从包含以下内容的活动扩展:

/**************************************** On Home **********************************/
private boolean leaveCalled = false;

@Override
public void startActivity(Intent intent) {  
    leaveCalled= true;
    super.startActivity(intent);
}

@Override
public void onBackPressed() {
    leaveCalled = true;
    super.onBackPressed();
}

@Override
protected void onStop() {   
    super.onStop();
    // Home button pressed
    if(!leaveCalled) {
        // Do whatever you like.
    }

    leaveCalled = false;
}
Run Code Online (Sandbox Code Playgroud)

编辑

您还需要从包含此内容的父类扩展Fragments.这是因为片段否则会以预期而非"HOME"方式提供在应用程序中的活动之间切换的额外路径.

@Override
public void startActivity(Intent intent) {  
    getActivity().startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

编辑2

我已经接近认为这不是解决这个问题最简单的方法......你还需要在使用这种方法的所有活动中添加onConfigurationChange ="orientation".然后你可以添加这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {   
    super.onConfigurationChanged(newConfig);
    leaveCalled = true;                     
    finish();
    startActivity(getIntent()); 
}
Run Code Online (Sandbox Code Playgroud)

编辑3

Urgh

@Override
public void finish() {
    leaveCalled = true;
    super.finish();
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*k B 8

您无法捕获HOME事件并以任何方式拦截它.当用户按下主页键时,将始终将用户带到设备的主屏幕.

如果您需要知道何时将Activity发送到后台,例如用户按下主页或后退键,我将实现onStop()方法.

  • 不,那不是真的.即使你的意思是onPause(),这个答案也不会正确 - 请记住,根本不能保证调用onStop.这些小小的"Android特定"让我大吃一惊.: - / (2认同)

小智 7

在Activity中使用onUserLeaveHint()方法

@Override
protected void onUserLeaveHint()
{
   super.onUserLeaveHint();
}
Run Code Online (Sandbox Code Playgroud)

http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()

  • 但是当我们移动到另一个活动时,这个方法会回调。如何区分按下的 HOME 键。谢谢 (3认同)

Ant*_*ony -1

android.text.method.KeyListener.onKeyDown([view],[text],KEYCODE_HOME,[event])
Run Code Online (Sandbox Code Playgroud)

我不确定其他参数如何适应,甚至不确定如何实现上述参数,但信息全部位于 keylistner文档中。

但他们还在另一页提到,主页键总是返回主页,你无法更改这一点。因此,如果您打算进行某种“您确定要退出吗”对话框,那是行不通的。