Esto me ha estado volviendo loco por un tiempo.
¿Hay alguna forma de detectar de manera confiable si se presionó el botón de inicio en una aplicación de Android?
De no ser así, ¿existe una forma sólida de saber qué provocó que una actividad entrara en pausa? es decir, ¿podemos detectar si fue causado por el inicio de una nueva actividad o presionando back / home?
Una sugerencia que he visto es anular onPause () y llamar a isFinishing (), pero esto devolverá falso al presionar el botón de inicio, tal como lo haría si se inicia una nueva actividad, por lo que esto no distingue entre los dos.
Cualquier ayuda muy apreciada.
** Actualización **: Gracias a @ android-hungry por este enlace: https://nishandroid.blogspot.com/
Anulando el siguiente método:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
Luego, el siguiente evento se activará al presionar el botón de inicio:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//The Code Want to Perform.
}
});
No estoy seguro de si hay efectos secundarios con esta línea:
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
Por lo que parecería que, contrariamente a la creencia popular, de hecho puede escuchar la tecla de inicio. Es preocupante que pueda devolver false y que la tecla de inicio no haga nada.
Actualización : como se esperaba, hay algunos efectos secundarios con esto: parece que los videos incrustados y los mapas de Google no son visibles con este modo habilitado.
Actualización : supuestamente este truco ya no funciona a partir de Android 4.0 en adelante
fuente
Activity.onUserLeaveHint()
.Respuestas:
El siguiente código funciona para mí :)
fuente
onHomeLongPressed
realidad, parece corresponder a la apertura de la actividad del sistema "Recientes". En mi teléfono, eso se activa al presionar el botón recientes al lado del botón de inicio, por lo que la suposición de su código de que es una pulsación larga en el hogar no siempre es correcta.final String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist"
Esta es una vieja pregunta, pero podría ayudar a alguien.
De acuerdo con la documentación, el método onUserLeaveHint () se llama cuando el usuario hace clic en el botón de inicio O cuando algo interrumpe su aplicación (como una llamada telefónica entrante).
Esto funciona para mí .. :)
fuente
Es imposible detectar y / o interceptar el botón INICIO desde una aplicación de Android. Está integrado en el sistema para evitar aplicaciones maliciosas de las que no se puede salir.
fuente
Necesitaba iniciar / detener la música de fondo en mi aplicación cuando la primera actividad se abre y se cierra o cuando cualquier actividad se detiene con el botón de inicio y luego se reanuda desde el administrador de tareas. La reproducción pura se detuvo / reanudó
Activity.onPause()
eActivity.onResume()
interrumpió la música por un tiempo, así que tuve que escribir el siguiente código:que interrumpe la reproducción solo cuando la aplicación (todas sus actividades) está cerrada o cuando se presiona el botón de inicio. Lamentablemente no logré cambiar el orden de las llamadas del
onPause()
método de la actividad de inicio yonResume()
de la actividad iniciada cuandoActivity.startActivity()
se llama (o detectar enonPause()
esa actividad está lanzando otra actividad de otra manera) por lo que este caso debe manejarse especialmente:Otro inconveniente es que esto requiere
GET_TASKS
permiso agregado aAndroidManifest.xml
:Modificar este código para que solo reaccione al presionar el botón de inicio es sencillo.
fuente
Anular
onUserLeaveHint()
en la actividad. Nunca habrá ninguna devolución de llamada a la actividad cuando se presente una nueva actividad o el usuario presione para retroceder.fuente
onUserLeaveHint ();
anular este método de clase de actividad. Esto detectará el clic de la tecla de inicio. Este método se llama justo antes de la devolución de llamada onPause () de la actividad, pero no se llamará cuando una actividad se interrumpa como una actividad en llamada entra en primer plano, aparte de las interrupciones, llamará cuando el usuario haga clic en la tecla de inicio.
fuente
Intente crear un contador para cada pantalla. Si el usuario toca INICIO, el contador será cero.
fuente
Podría considerar una solución de Andreas Shrade en su publicación sobre Cómo crear un modo de quiosco funcional en Android . Es un poco hacker, pero dadas las razones por las que se evita la interceptación del botón de inicio, tiene que ser así;)
fuente
Tuve este problema, y dado que anular el método onKeyDown () no logró nada debido a que el sistema Android subyacente no llamó a este método, lo resolví anulando onBackPressed (), y tenía un valor booleano establecido en falso , porque presioné hacia atrás, déjame mostrarte lo que quiero decir en el código:
Entonces, la razón por la que esto funcionó es porque la única forma de navegar fuera de esta actividad es presionando Atrás o Inicio, por lo que si se presionó Atrás, sé que la causa no fue el hogar, pero de lo contrario, la causa fue el hogar, por lo tanto, establecí el booleano predeterminado. valor para homePressed para ser verdad. Sin embargo, esto solo funcionará con una única instancia de actividad en su aplicación porque, de lo contrario, tiene más posibilidades de hacer que se llame al método onPause ().
fuente
homePressed
en verdadero, y luego cambiar a otra aplicación pensaría que se presionó Inicio cuando en realidad no lo estaba.Desde API 14, puede usar la función
onTrimMemory()
y verificar la banderaTRIM_MEMORY_UI_HIDDEN
. Esto le dirá que su aplicación va a pasar a segundo plano.Entonces, en su clase de aplicación personalizada, puede escribir algo como:
Para un estudio en profundidad de esto, lo invito a leer este artículo: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have -a/
fuente
Una opción para su aplicación sería escribir una pantalla de inicio de reemplazo usando el intento android.intent.category.HOME. Creo que este tipo de Intent puede ver el botón de inicio.
Más detalles:
http://developer.android.com/guide/topics/intents/intents-filters.html#imatch
fuente
Dado que solo desea que se vuelva a mostrar la actividad raíz cuando se inicie la aplicación, ¿tal vez pueda obtener este comportamiento cambiando los modos de inicio, etc.en el manifiesto?
Por ejemplo, ¿ha intentado aplicar el atributo android: clearTaskOnLaunch = "true" a su actividad de lanzamiento, tal vez en conjunto con android: launchMode = "singleInstance" ?
Tasks and Back Stack es un gran recurso para ajustar este tipo de comportamiento.
fuente
Es una mala idea cambiar el comportamiento de la tecla de inicio. Es por eso que Google no le permite anular la tecla de inicio. En general, no jugaría con la tecla de inicio. Debe brindarle al usuario una forma de salir de su aplicación si se pierde en la maleza por cualquier motivo.
Imagino que cualquier solución tendrá efectos secundarios no deseados.
fuente
Recientemente estaba tratando de detectar el botón de inicio, porque necesitaba que hiciera lo mismo que el método " onBackPressed () ". Para hacer esto, tuve que anular el método " onSupportNavigateUp () " así:
Funcionó perfectamente. =)
fuente
La respuesta de Jack funciona perfectamente para el
click
evento, mientraslongClick
que la considera comomenu
hacer clic en un botón.Por cierto, si alguien se pregunta cómo hacerlo a través de kotlin,
fuente
La clave de inicio de Android manejada por la capa de marco no puede manejar esto en el nivel de capa de aplicación. Porque la acción del botón de inicio ya está definida en el nivel inferior. Pero si está desarrollando su ROM personalizada, entonces podría ser posible. Google restringió las funciones de anulación del BOTÓN INICIO por razones de seguridad.
fuente
Esto funciona para mi. Puede anular el método onUserLeaveHint https://www.tutorialspoint.com/detect-home-button-press-in-android
fuente