2012-01-23 16 views
13

Quiero detectar cuando mi aplicación se envía al fondo. Hay muchas preguntas sobre cómo enganchar la tecla HOME: entiendo que esto solo es posible registrándome como una aplicación de inicio.Desconexión automática de Android cuando la aplicación va al fondo

... PERO ... como siempre hay un cliente que quiere un determinado comportamiento ...

Tenemos una aplicación con requerimientos de alta seguridad. El cliente quiere que la aplicación cierre la sesión del servidor siempre que la aplicación entre en segundo plano por cualquier razón (llamada telefónica, tecla HOME, volver a la última actividad) (* * para aclarar Quiero decir que cuando la actividad frontal aparece en la pantalla no es una de las actividades de mi aplicación * *).

Entonces, si no puedo enganchar la tecla HOME, ¿qué otras opciones hay? Obviamente, solo conectar onPause() no ayudará, porque eso es Activity -específicos.

Lo "mejor" que hemos encontrado es mantener una variedad de referencias de actividad en nuestra clase de aplicación. En cada actividad onResume(), lo agregamos a esta matriz. En onPause() lo eliminamos. También en onPause() enumeramos a través de esta matriz para averiguar si alguna de las actividades registradas están en primer plano. Si no se encuentra actividad en primer plano, el usuario se desconecta.

No estoy contento con esto como una solución y espero encontrar una manera mejor.

Respuesta

5

Nos eneded ir por algo basado en la solución aquí por @peceps: Run code when Android app is closed/sent to background.

+1

Acabo de agregar un nuevo comentario a este hilo donde muestro un método mejor (en mi opinión) usando Application.ActivityLifecycleCallbacks así como el método @peceps. Ver mi respuesta para el hilo: http://stackoverflow.com/a/13996042/327386 – RPM

+0

+1 una gran solución para API 14+ –

0

O podría utilizar un objeto compartido que sea un singleton, y crear solo onPause() y onResume() que obtendrán/establecerán los datos en ese objeto compartido. Esas funciones se usarán en todas las actividades ' y onResume.

0

Esto debería ayudar:

Este método SA se encuentra en la clase de actividad

protected void onUserLeaveHint() 

    Since: API Level 3 
    Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice. For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground, onUserLeaveHint() will not be called on the activity being interrupted. In cases when it is invoked, this method is called right before the activity's onPause() callback. 
    This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication. 
+1

Señala que los métodos de Actividades no funcionarán dado que usa múltiples actividades. Realmente no importa si usa onPause o onUserLeaveHint. La única diferencia real es que el segundo es despedido en menos casos que el primero. – dtech

1

trabajé antes de resolver el mismo problema, pero no había manera de hacerlo que yo sepa, excepto a su manera gracias ahora . y el mejor método para capturar el estado que muestra la actividad es onStart(), onStop(), este método detecta el cambio de visibilidad real y cuenta el recuento de sus actividades para cerrar la sesión.

0

No sé si va a ayudar a salir pero voy a tratar de esta manera

  1. Crear una base de Activity y anular su método onStop() cerrar la sesión desde el servidor
  2. Todo Activities de mi aplicación se extenderá por encima de la clase base.

ahora qué ocurre si en cualquier actividad va en condición onStop va a cerrar la sesión desde el servidor, no importa cómo la actividad entra en el fondo

Nota: Pero si desde el código detiene cualquier actividad si llama terminar entonces también será cerrar la sesión por lo que tiene que trabajar en ese escenario

+0

thx: comprendo el ciclo de vida de las actividades de Android: el problema es encontrar una forma de evitar el ciclo de vida de la aplicación y la decisión de los diseñadores de Android de no dejar que una aplicación enganche el botón INICIO. La lógica que mencionas en tu nota es exactamente lo que trato de resolver haciendo la pregunta. Estoy buscando una manera elegante de hacer eso. –

+0

no hay ningún problema en que crear un método en su BaseActivity que establece el valor booleano verdadero cuando está terminando la actividad y compruebe que el valor booleano en onStop de BaseActivity dependiendo de que el valor de cierre de sesión o viceversa – ingsaurabh

6

// servicio de uso

// en ese

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_CALL); 
    filter.addAction(Intent.ACTION_ANSWER); 

    registerReceiver(mIntentReceiver, filter); 

}

// entonces en BroadcastReceiver

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if(action.equalsIgnoreCase("android.intent.category.HOME")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.SCREEN_OFF")) 
      { 
//logout logic 
} 

else if(action.equalsIgnoreCase("android.intent.action.DIAL")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.CALL")){ 
/ /logout logic 
} 
} 
+0

me gusta el pensamiento aquí, pero hay otras formas para que una actividad quede en segundo plano, por ejemplo otra actividad llevándose al frente. –

3

lo manejé mediante el almacenamiento de una marca de tiempo cuando mi actividad cierra pausas \. Cuando se inicia otra actividad, se lee la marca de tiempo y si varía más de x segundos, realizo el cierre de sesión.

Si necesita realizar físicamente a un cierre de sesión (es decir, en un servidor remoto), creado AlarmManager cuando la actividad se detiene para salir X segundos en el futuro. Puede cancelar esta alarma si se inicia otra actividad antes de que se active.

+0

¡La idea de agregar un TimeStamp en sus actividades fue brillante! –

0

android:clearTaskOnLaunch puede ser útil. No lo desconecta cuando pasa al segundo plano, pero puede forzar que la pantalla de inicio de sesión sea la primera cuando acaba de regresar.

Cuestiones relacionadas