¿Puede decirme cómo puede mi actividad detectar al usuario presionando INICIO tecla?¿Cómo puedo detectar al usuario presionando la tecla INICIO en mi actividad?
Gracias.
¿Puede decirme cómo puede mi actividad detectar al usuario presionando INICIO tecla?¿Cómo puedo detectar al usuario presionando la tecla INICIO en mi actividad?
Gracias.
android.text.method.KeyListener.onKeyDown([view],[text],KEYCODE_HOME,[event])
no estoy seguro de cómo los demás parámetros se ajustan en, o incluso la forma de poner en práctica lo anterior, pero la información es todo en la keylistner documentation.
Pero también mencionan en another page que la llave de inicio SIEMPRE se va a casa, no puede cambiar eso. Entonces, si planeas tener algún tipo de diálogo "¿estás seguro de que quieres salir?", Eso no funcionaría.
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 necesita saber cuándo su actividad se enviará a segundo plano, como si el usuario presionara las teclas de inicio o de fondo, implementaría el método onStop().
Puede escribir un oyente de Radio y configurar el filtro para
<category android:name="android.intent.category.HOME" />
Desde el Receptor de radio comenzar la actividad ur/notificar a la actividad.
Esto no es posible porque no está transmitiendo intento ... – Renetik
Puede detectar presionar un botón HOME a través de Activity.onUserLeaveHint(). Este método se llama en dos situaciones; cuando el usuario presiona INICIO y cuando se inicia una nueva actividad. Asegúrese de diferenciar de alguna manera entre los dos.
No se llama cuando el usuario presiona Inicio, si la Actividad actual es el Iniciador predeterminado actualmente :) – arts777
También se invoca cuando la actividad inicia otra actividad. – Blackhex
Acepto @Blackhex. http: // stackoverflow.com/questions/6612058/android-onbackpressed-onuserleavehint/8749061 # 8749061 pregunta también dice lo mismo. Por lo tanto, no funcionará en todas las condiciones ahora. –
No hay forma formal de recibir una notificación de la tecla "INICIO". Pero hay un trabajo bastante simple para que su aplicación distinga entre presionar una tecla "INICIO" y cualquier otra acción que pueda hacer que la Actividad se detenga.
Para cada clase que necesita para realizar alguna acción en un "HOME" pulsación de tecla tiene que se extienden 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 debe ampliar tus Fragmentos de una clase padre que contiene esto. Esto se debe a que, de lo contrario, los fragmentos proporcionarían una ruta adicional para alternar entre las actividades de la aplicación de forma esperada y no como "INICIO".
@Override
public void startActivity(Intent intent) {
getActivity().startActivity(intent);
}
EDIT 2
me estoy acercando a pensar que esto no es la forma más fácil de lidiar con esto ... Es necesario añadir también onConfigurationChange = "orientación" a la totalidad de su actividades que usan este método. A continuación, puede añadir lo siguiente:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
leaveCalled = true;
finish();
startActivity(getIntent());
}
EDITAR 3
Urgh
@Override
public void finish() {
leaveCalled = true;
super.finish();
}
Estos no son buenos. Hay demasiados casos en que 'OnStop()' de la Actividad es 'leaveCalled = false' como llamada de teléfono, lanzamiento de servicio de la actividad, etc. ... – Yeung
De acuerdo, pero este es el mismo problema que se enfrenta con cualquier otro" trabajo alternativo "para agarra el botón de inicio No es algo que está incluido en la API. – Graeme
Se puede hacer (al menos uptil 2.3). Probado en la versión de Android 2.3.5 HTC Wildfire-S no rooteado.fragmento de código para coger/desactivar 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;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//The Code Want to Perform.
}
});
¡No funciona! – amiekuser
no funciona desde Android 4.0 o superior –
¡Buena respuesta - funciona como un encanto! : D NOOOOOT :) –
actualización [de agosto de 2015]: De acuerdo con el comentario de JM Lord, esta respuesta podría no funcionar como se desea para dispositivos Lollipop y superiores. Ver Alternative to getRunningTasks in Android L
Aunque, su una vieja pregunta, pero la mayoría de las respuestas no funcionó para mí en el nivel API 17 o superior. Estoy respondiendo lo que finalmente funcionó para mí. He intentado con muchos métodos, pero ninguno de ellos funciona como hoy. Probé respuestas en
Call method when home button pressed on android,
Detect home button press in android y
Overriding the Home button - how do I get rid of the choice?. Lo esencial era que Home es como un botón de escape de emergencia. Entonces no puedes anularlo pero puedes detectarlo de alguna manera.
Algunos de los que he probado (incluyendo por encima de respuestas) y no funcionó son:
Usando keyCode==KeyEvent.KEYCODE_HOME
de muchas maneras como indicados anteriormente. Ahora, si lee la documentación de KeyEvent.KEYCODE_HOME, dice que This key is handled by the framework and is never delivered to applications
. Entonces no es más válido ahora.
He intentado usar onUserLeaveHint()
. La documentación dice:
llama como parte del ciclo de vida de actividad cuando se trata de una actividad entrar en el fondo como el resultado de la elección del usuario. Por ejemplo, cuando el usuario presiona la tecla de inicio, onUserLeaveHint() se llamará a , pero cuando una llamada entrante hace que la actividad de llamada entrante pase automáticamente al primer plano.
El problema con esto es que el método también es llamado cuando se inicia una Activity
desde dentro de la actividad en la que está llamando onUserleaveLint()
, como era mi caso. Consulte la pregunta Android onBackPressed/onUserLeaveHint para obtener más información. Por lo tanto, no estoy seguro de que se llame SOLO al presionar el botón de inicio.
Llamando onStop()
. También se puede invocar cuando una actividad se agrega a la actividad existente y la cubre por completo. Entonces esto tampoco funcionará.
Finalmente el siguientes trabajó para mí:
Al ver How to check current running applications in Android? se puede decir que si la suya es la reciente tarea que se muestra en una presión prolongada del botón de inicio, a continuación, se envía a fondo.
Por lo tanto, en su onPause()
de la actividad donde está tratando de detectar el botón de inicio presionado, puede verificar si la aplicación se ha enviado a 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 verificar si la suya es la aplicación que ha sido enviado recientemente a un segundo plano:
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 se olvide de incluir el siguiente permiso de su manifiesto:
<uses-permission android:name="android.permission.GET_TASKS" />
No estoy seguro de si hay algún inconveniente de esto, pero funcionó bien para mí. Espero que ayude a alguien algún día.
P.S .: Si utiliza este método en una actividad que se ha iniciado con el indicador FLAG_ACTIVITY_NO_HISTORY
, esto no será útil, ya que comprueba el historial reciente para averiguar si se hizo clic en el botón Home
. Método
uso onUserLeaveHint() en su actividad
@Override
protected void onUserLeaveHint()
{
super.onUserLeaveHint();
}
http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()
mejor respuesta que he encontrado hasta ahora :) – Neo
Pero este método devuelve la llamada cuando nos movemos a otra actividad. Cómo diferenciar al botón INICIO presionado. Gracias – sandeepmaaram
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..!");
}
}
encontré esta solución basada en la sugerencia de @Springfeed. La pregunta es bastante genérica, tenga en cuenta que esta solución particular será:
Este código está en mi clase base Activity
(de los cuales todas las actividades heredan)
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 podrían utilizar el contexto de aplicación para poner en marcha las intenciones, que define un ContextWrapper en poder de mi clase de aplicaciones 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 :)
No, eso no es cierto. Incluso si se refería a OnPause(), esta respuesta no sería correcta: tenga en cuenta que no se garantiza que onStop se llame en absoluto. Estos pequeños "detalles de Android" me hacen volar la cabeza. : -/ –