¿Cómo puedo detectar el usuario pulsando la tecla HOME en mi actividad?

¿Puede decirme por favor cómo puede mi actividad detectar el usuario presionando la tecla HOME ?

Gracias.

Actualización [Agosto de 2015]: Según el comentario de JM Lord , esta respuesta podría no funcionar como se desee para los dispositivos Lollipop y superiores. Vea la alternativa a getRunningTasks en Android L


Aunque, su una vieja pregunta, pero la mayoría de las respuestas no funcionó para mí en el API de nivel 17 y superiores. Estoy respondiendo lo que finalmente funcionó para mí. He intentado muchos métodos, pero ninguno de ellos está funcionando como hoy. Traté de responder

Método de la llamada cuando el botón casero presionó en androide ,

Detectar la pulsación del botón de inicio en android y

Anulación del botón Inicio – ¿cómo puedo deshacerme de la elección? . Lo esencial era que Home es como un botón de escape de emergencia. Así que no puede anularlo, pero puede detectarlo de alguna manera.

Algunos de los que probé (incluyendo las respuestas anteriores) y no funcionaron son:

  1. Usando keyCode==KeyEvent.KEYCODE_HOME de muchas maneras como se indicó anteriormente. Ahora, si usted lee la documentación de KeyEvent.KEYCODE_HOME , dice que This key is handled by the framework and is never delivered to applications . Así que no es más válido ahora.

  2. Intenté usar onUserLeaveHint() . La documentación dice:

    Se llama como parte del ciclo de vida de la actividad cuando una actividad está a punto de entrar en segundo plano como resultado de la elección del usuario. Por ejemplo, cuando el usuario presiona la tecla Inicio, se llamará onUserLeaveHint (), pero cuando una llamada telefónica entrante hace que la Actividad en llamada se traiga automáticamente al primer plano.

    El problema con esto es que el método también se llama cuando se inicia una Activity dentro de la actividad en la que se está invitando a onUserleaveLint() , como era mi caso. Consulte la pregunta de Android enBackPressed / onUserLeaveHint para obtener más información. Así que no está seguro de que sería llamada SOLAMENTE presionando el botón de inicio.

  3. Llamada onStop() . También se puede llamar cuando una actividad viene encima de la actividad existente y la cubre completamente. Así que esto también no funcionará.

Finalmente lo siguiente funcionó para mí:

¿Cómo ver las aplicaciones actuales en ejecución en Android? Usted puede decir que si el suyo es la tarea reciente que se demuestra en el presionar largo el botón casero, entonces era enviar al fondo.

Por lo tanto, en la onPause() de la actividad en la que está intentando detectar el botón de inicio pulsado, puede comprobar si la aplicación se ha enviado al fondo.

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

Función para comprobar si la tuya es la aplicación que más recientemente se ha enviado al fondo:

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

Gracias a @idish por señalar que no olvides incluir el siguiente permiso en tu manifiesto:

 <uses-permission android:name="android.permission.GET_TASKS" /> 

No estoy seguro de si hay desventajas de esto, pero funcionó para mí bien. Espero que ayude a alguien algún día.

PS: Si utiliza este método en una actividad que se ha iniciado con el flag FLAG_ACTIVITY_NO_HISTORY , esto no será útil ya que comprueba el historial reciente para averiguar si se pulsó el botón Home .

Puede detectar una pulsación de botón HOME a través de Activity.onUserLeaveHint (). Este método se llama en dos situaciones; Cuando el usuario pulsa HOME y cuando se inicia una nueva actividad. Asegúrese de diferenciarse de alguna manera entre los dos.

No puede capturar el evento HOME e interceptarlo de ninguna manera. El usuario siempre será llevado a la pantalla de inicio de su dispositivo cuando presione la tecla de inicio.

Si necesitas saber cuándo se está enviando tu actividad al fondo, como si el usuario pulsara las teclas de inicio o de retroceso, implementaría el método onStop ().

No hay manera formal de ser notificado de una pulsación de tecla "HOME". Pero hay un trabajo bastante sencillo para que tu aplicación distinga entre una pulsación de tecla "HOME" y cualquier otra acción que haga que la actividad se detenga.

Para cada clase que necesite realizar alguna acción en una pulsación de tecla "HOME", haga que se extiendan desde una actividad que contiene lo siguiente:

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

EDITAR

También necesitarás extender tus Fragmentos de una clase padre que contenga esto. Esto se debe a que, de lo contrario, los fragmentos proporcionan una ruta adicional para cambiar entre las actividades de su aplicación de una manera esperada y no "HOME".

 @Override public void startActivity(Intent intent) { getActivity().startActivity(intent); } 

EDIT 2

Me estoy acercando a pensar que esta no es la manera más fácil de lidiar con esto … Necesitas agregar también onConfigurationChange = "orientación" a todas tus actividades que usan este método. A continuación, puede agregar esto:

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

EDIT 3

Urgh

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

Use el método onUserLeaveHint () en su actividad

 @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); } 

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

Se puede hacer (hasta 2.3 por lo menos). Probado en Android versión 2.3.5 no arraigada HTC WildFire-S. Snippet de código para capturar / deshabilitar todas las teclas de control:

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_SEARCH ) { Toast.makeText(getApplicationContext(),"You pressed a control button with keyCode : " + keyCode, Toast.LENGTH_SHORT).show(); return false; } else { Toast.makeText(getApplicationContext(),"You pressed" + keyCode, Toast.LENGTH_SHORT).show(); } return true; } public boolean onKeyUp(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_SEARCH ) { return false; } else { // Do nothing } return true; } 

Puede escribir un escucha de difusión y establecer el filtro en

 <category android:name="android.intent.category.HOME" /> 

Desde el receptor de Broadcast inicie su actividad / notifique la actividad.

Encontré esta solución basada en la sugerencia de @Springfeed. La pregunta es bastante genérica, tenga en cuenta que esta solución en particular:

  • Trabajo en Lollipop, así como versiones más bajas de Android (mi código precedente basado en ActivityManager falló en Lollipop)
  • Captura los botones Inicio e Historia
  • No se captura Inicio si la actividad en sí se define como Inicio – Siempre
  • Capturará Home si la actividad es una de las muchas opciones de casa, o no Home en absoluto.

Este código está en mi clase de Activity básica (de la que heredan todas las actividades)

  public boolean startingActivity = false; @Override protected void onUserLeaveHint() { if(startingActivity) { // Reset boolean for next time startingActivity = false; } else { // User is exiting to another application, do what you want here Log.i(TAG, "Exiting"); ... } } @Override public void startActivity(Intent intent) { startingActivity = true; super.startActivity(intent); } @Override public void startActivityForResult(Intent intent, int requestCode) { startingActivity = true; super.startActivityForResult(intent, requestCode); } 

Como algunos métodos también pueden usar el contexto de la aplicación para lanzar intentos, definí un ContextWrapper en mi clase Application para cambiar el booleano también (tenga en cuenta que tengo acceso estático a la actividad más alta de mi propia aplicación a través de esa clase base).

 public class MyContext extends ContextWrapper { public MyContext(Context base) { super(base); } @Override public void startActivity(Intent intent) { BaseActivity activity = BaseActivity.getActivity(); if(activity != null) { activity.startingActivity = true; } super.startActivity(intent); } } 

Uno podría querer anular startActivities (…) así, si es necesario.

Espero que esto ayude 🙂

 android.text.method.KeyListener.onKeyDown([view],[text],KEYCODE_HOME,[event]) 

No estoy seguro de cómo encajan los demás parámetros, ni siquiera cómo implementar lo anterior, pero la información está en la documentación del keylistner.

Pero también mencionan en otra página que la llave de casa SIEMPRE va a casa, no se puede cambiar eso. Así que si planeas tener algún tipo de diálogo "¿estás seguro de que quieres salir", eso no funcionaría.

 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; } public void onPause() { super.onPause(); if(isApplicationSentToBackground(this)) { Log.i("Home", "Home Pressed..!"); } } 
 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.