2010-02-05 6 views

Respuesta

0
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.

8

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().

+2

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. : -/ –

3

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.

+0

Esto no es posible porque no está transmitiendo intento ... – Renetik

12

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.

+0

No se llama cuando el usuario presiona Inicio, si la Actividad actual es el Iniciador predeterminado actualmente :) – arts777

+1

También se invoca cuando la actividad inicia otra actividad. – Blackhex

+0

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. –

8

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(); 
} 
+0

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

+0

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

5

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; 
} 
-7
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) {  

    if(keyCode == KeyEvent.KEYCODE_HOME) 
    { 

     //The Code Want to Perform. 

    } 
}); 
+0

¡No funciona! – amiekuser

+0

no funciona desde Android 4.0 o superior –

+1

¡Buena respuesta - funciona como un encanto! : D NOOOOOT :) –

38

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:

  1. 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.

  2. 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.

  3. 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

+0

Me ayudó hoy :) Esta es una gran solución. Muchas gracias. Nota: no olvide incluir el siguiente permiso en su manifiesto: idish

+1

Me alegro de que haya sido útil. Gracias por señalar eso. Edité la respuesta. –

+0

¡Perfecto! Gracias Shobhit! – Rendy

0
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..!"); 
    } 
} 
2

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á:

  • El trabajo sobre Lollipop, así como las versiones de Android inferiores (mi código precedente basado en la ActivityManager fallado en Lollipop)
  • conjugue los botones Inicio Historia y
  • No capturará Inicio si la actividad en sí misma se define como Inicio - Siempre
  • Capturará Inicio si la actividad es una de muchas opciones de inicio, o no Inicio en absoluto.

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 :)

Cuestiones relacionadas