2012-01-23 9 views
13

Voglio rilevare quando la mia applicazione viene inviata in background. Ci sono molte domande sull'aggancio del tasto HOME - Capisco che ciò sia possibile solo registrandoti come app di avvio.Disconnessione automatica Android quando l'app passa allo sfondo

... MA ... come sempre c'è un cliente che vuole un certo comportamento ...

Abbiamo un app con elevati requisiti di sicurezza. Il client vuole che l'app si disconnetta dal server ogni volta che l'app entra in background per qualsiasi motivo (telefonata, tasto HOME, torna all'ultima attività) (* * per chiarire intendo che quando l'attività frontale sullo schermo non è una delle attività della mia app * *).

Quindi, se non riesco ad agganciare il tasto HOME, quali altre opzioni ci sono? Ovviamente il semplice hooking onPause() non è d'aiuto, perché questo è Activity -specific.

Il "migliore" che abbiamo trovato è di mantenere una serie di riferimenti di attività nella nostra classe Application. In ogni onResume() di ogni attività lo aggiungiamo a questo array. In onPause() lo rimuoviamo. Inoltre, in onPause(), si enumera attraverso questa matrice per scoprire se alcune delle attività registrate sono in primo piano. Se non viene trovata alcuna attività in primo piano, l'utente viene disconnesso.

Sono insoddisfatto di questa soluzione e spero di trovare un modo migliore.

risposta

5

Abbiamo finito per ritornarci andare per qualcosa sulla base di soluzione qui da @peceps: Run code when Android app is closed/sent to background.

+1

Ho appena aggiunto un nuovo commento a questo thread in cui mostro un metodo migliore (a mio parere) utilizzando Application.ActivityLifecycleCallbacks e il metodo @peceps. Vedi la mia risposta per il thread: http://stackoverflow.com/a/13996042/327386 – RPM

+0

+1 un'ottima soluzione per API 14+ –

0

Oppure è possibile utilizzare un oggetto condiviso che è un singleton e creare singoli onPause() e onResume() che otterranno/imposteranno i dati su quell'oggetto condiviso. Tali funzioni verranno utilizzate in tutte le attività ' e onResume.

0

Questo dovrebbe aiutare:

Questo metodo sa trovato nella Classe di attività

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

Egli sottolinea che i metodi di attività non funzionano poiché utilizza più attività. Non importa se usi onPause o onUserLeaveHint. L'unica vera differenza è che il secondo viene licenziato in meno casi rispetto al primo. – dtech

1

ho lavorato prima per risolvere lo stesso problema, ma non c'era modo di farlo come so tranne che per il modo in cui usando ora . e il metodo migliore per sovrascrivere lo stato di visualizzazione delle attività è onStart(), onStop() questo metodo acquisisce una reale modifica della visibilità e conta il numero di stack delle attività per effettuare il logout.

0

Non so se la sua intenzione di dare una mano, ma cercherò in questo modo

  1. creare una base Activity e ignorare il suo metodo onStop() logout dal server
  2. Tutti Activities della mia app si estenderà sopra la classe base.

Così ora che cosa succede se in una qualsiasi attività va in condizioni onStop sarà il logout dal server, non importa come l'attività va in fondo

Nota: Ma se dal codice interrompe qualsiasi attività chiamando finire poi anche il logout sarà quindi bisogna lavorare in tale scenario

+0

thx - Comprendo il ciclo di vita delle attività Android: il problema è cercare un modo per aggirare il ciclo di vita dell'applicazione e la decisione dei progettisti Android di non lasciare che un'app agganci il pulsante HOME. La logica che hai menzionato nella tua nota è esattamente quello che sto cercando di risolvere ponendo la domanda. Sto cercando un modo elegante per farlo. –

+0

non c'è alcun problema nel creare un metodo in BaseActivity che imposta il valore booleano vero quando si sta terminando l'attività e controllare il valore booleano in onStop di BaseActivity a seconda del valore di logout o viceversa – ingsaurabh

6

// servizio uso

// in quel

@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); 

}

// poi nel 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

Mi piace pensare qui, ma ci sono altri modi per un'attività di andare in secondo piano - ad es un'altra attività che si sta portando avanti. –

3

ho gestito tutto memorizzando un timestamp, quando la mia attività chiude \ pause. Quando inizia un'altra attività, legge il timestamp e se varia di più di x secondi eseguo la disconnessione.

Se è necessario eseguire fisicamente un logout (cioè su un server remoto), istituito AlarmManager quando l'attività si ferma logout x secondi in futuro. È possibile annullare questo allarme se si avvia un'altra attività prima che si attivi.

+0

L'idea di aggiungere un TimeStamp alle tue attività è stata geniale! –

0

android:clearTaskOnLaunch potrebbe essere utile. Non ti disconnette quando vai in background, ma puoi forzare lo schermo di login ad essere il primo quando torni indietro.

Problemi correlati