Método de llamada cuando se presiona el botón de inicio

Tengo este método en una de mis actividades de Android:

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { Log.d("Test", "Back button pressed!"); } else if(keyCode == KeyEvent.KEYCODE_HOME) { Log.d("Test", "Home button pressed!"); } return super.onKeyDown(keyCode, event); } 

Pero, aunque KEYCODE_HOME es válido, el método de registro nunca se dispara. Esto funciona para el botón de retroceder. ¿Alguien sabe por qué es esto y cómo hacer que esto funcione?

El botón Inicio es un botón muy peligroso para anular y, debido a eso, Android no le permitirá anular su comportamiento de la misma manera que lo hace con el botón ATRÁS.

Eche un vistazo a esta discusión.

Notarás que el botón de inicio parece estar implementado como una invocación de intención, por lo que terminarás teniendo que agregar una categoría de intención a tu actividad. Luego, cada vez que el usuario llegue a su casa, su aplicación aparecerá como una opción. Debería considerar qué es lo que busca lograr con el botón de inicio. Si no se va a reemplazar la pantalla de inicio predeterminada del dispositivo, no me gustaría sobrecargar el botón INICIO, pero es posible (por discusión en el hilo anterior).

Me llevó casi un mes superar esto. Justo ahora resolví este problema. En su actividad onPause () debe incluir la siguiente condición if:

  if (this.isFinishing()){ //Insert your finishing code here } 

La función es Finalizar () devuelve un valor booleano. Es cierto si su aplicación se está cerrando, False si su aplicación todavía se está ejecutando, pero por ejemplo, la pantalla se apaga.

¡Espero eso ayude!

El botón HOME no puede ser interceptado por las aplicaciones. Este es un comportamiento de diseño en Android. La razón es evitar que las aplicaciones maliciosas tengan control sobre su teléfono (si el usuario no puede presionar hacia atrás o hacia su casa, es posible que nunca pueda salir de la aplicación). El botón Inicio se considera la “zona segura” del usuario y siempre iniciará la aplicación de inicio configurada del usuario.

La única excepción a lo anterior es cualquier aplicación configurada como reemplazo del hogar. Lo que significa que tiene lo siguiente declarado en su AndroidManifest.xml para la actividad relevante:

      

Al presionar el botón de inicio, se onNewIntent la actividad actual de la aplicación hogareña onNewIntent .

Descubrí que cuando presiono el botón HOME se llama al método onStop (). Puede usar la siguiente pieza de código para monitorearlo:

 @Override protected void onStop() { super.onStop(); Log.d(tag, "MYonStop is called"); // insert here your instructions } 

Tengo una solución simple para manejar la presión del botón de inicio. Aquí está mi código, puede ser útil:

 public class LifeCycleActivity extends Activity { boolean activitySwitchFlag = false; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { activitySwitchFlag = true; // activity switch stuff.. return true; } return false; } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(activitySwitchFlag) Log.v("TAG", "activity switch"); else Log.v("TAG", "home button"); activitySwitchFlag = false; } public void gotoNext(View view){ activitySwitchFlag = true; startActivity(new Intent(LifeCycleActivity.this, NextActivity.class)); } } 

Como resumen, coloque un valor booleano en la actividad, cuando ocurra el cambio de actividad (evento de actividad), configure la variable y en evento onpause verifique esta variable.

usa el método onPause() para hacer lo que quieras hacer en el botón de inicio.

KeyEvent.KEYCODE_HOME NO se puede interceptar.

Sería bastante malo si fuera posible.

(Editar) : Acabo de ver la respuesta de Nicks, que está perfectamente completa;)

También tuve problemas con el botón HOME por un tiempo. Quería detener / omitir un servicio en segundo plano (que sondea la ubicación) cuando el usuario hace clic en el botón INICIO.

aquí es lo que implementé como una solución “hack-like”;

mantener el estado de la aplicación en SharedPreferences usando un valor booleano

en cada actividad

onResume () -> set appactive = true

onPause () -> set appactive = false

y el servicio de fondo comprueba el estado de la aplicación en cada ciclo, omite la acción

IF appactive = falso

funciona bien para mí, al menos ya no drena la batería, espero que esto ayude …

Usando BroadcastReceiver

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // something // for home listen InnerRecevier innerReceiver = new InnerRecevier(); IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(innerReceiver, intentFilter); } // for home listen class InnerRecevier extends BroadcastReceiver { final String SYSTEM_DIALOG_REASON_KEY = "reason"; final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (reason != null) { if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { // home is Pressed } } } } }