Come determinare se una delle mie attività è in primo piano

Ho implementato un BroadcastReceiver che viene triggersto da AlarmManager. L'AlarmManager viene inizializzato su BOOT_COMPLETED. Quindi devo dichiarare il ricevitore nel manifesto.

Il mio problema è che voglio che BroadcastReceiver funzioni solo quando nessuna delle mie attività è in primo piano (anche se l'utente non interagisce con la mia applicazione). Tiri le informazioni da un server remoto e non voglio informare l'utente se è attualmente nella mia applicazione.

  • Pop up window per visualizzare alcune cose in un frammento
  • Implementare il metodo startForeground in Android
  • Come possiamo utilizzare il codice incorporato di YouTube in un'applicazione Android usando il webview?
  • rendendo un servizio un servizio di primo piano
  • Aggiorna lo stato selezionato del cassetto di navigazione dopo la schiena
  • Come sapere se è una sua tavoletta o telefono in android a livello di programmazione?
  • Finora non sono riuscito a trovare un modo per determinare se la mia applicazione è in primo piano. C'è un modo per fare una cosa del genere? ActivityManager mi dice se la mia applicazione è in esecuzione ma non se è in primo piano.

    Il problema è molto simile a quello descritto qui: informa l'attività da un BroadcastReceiver SOLO se è in primo piano

    SOLUZIONE:

    Dopo aver valutato diverse soluzioni voglio descrivere rapidamente ciò che penso sia il metodo migliore per affrontare le attività in background / priorità.

    Il modo preferito è quello di registrare un ricevitore di trasmissione nel metodo onResume della vostra attività e di cancellarla sulle attività su onPause. Qualsiasi servizio o altro elemento di background dovrà submit un'intenzione di trasmissione con un'azione specifica che la tua attività intercetta.

    Se la tua attività è in primo piano, avrà il suo ricevitore di intenti registrato e è in grado di affrontare direttamente l'intenzione di submit dal tuo servizio. Se non è in primo piano, non riceverà l'intento ma il servizio che ha invocato la trasmissione saprà che nessuno ha intercettato la sua intenzione di trasmissione e sarà in grado di far fronte a se stessa. Ad esempio, potrebbe lanciare l'attività desiderata, mostrare una notifica ecc.

  • Casella di commento di Facebook in Android
  • effetto di android sul bitmap
  • Android: Come scrivere l'intenzione della macchina fotografica in torrone android
  • geo tagging in android
  • Come implementare phonegap / cordova in webview Android?
  • Come modificare dynamicmente il layout XML di Android
  • 7 Solutions collect form web for “Come determinare se una delle mie attività è in primo piano”

    La risposta seguente: "L' applicazione è in esecuzione in background ", riassume le soluzioni disponibili per il controllo di background e di primo piano.

    Nota:
    In precedenza questa risposta ha suggerito di utilizzare ActivityManager.getRunningAppProcesses() , tuttavia quel metodo sembra non essere affidabile e il suo utilizzo è scoraggiato. Controlla il link sopra per i dettagli.

    La tua attività può tenere traccia del proprio stato sul fatto che sia in primo piano (impostare boolean a true su onStart() , a false su onStop() ). Ahimè, quel boolean non viene fornito automaticamente da Activity .

    ActivityManager#getRunningAppProcesses() restituisce un elenco di RunningAppProcessInfo . Ogni RunningAppProcessInfo ha un field chiamato importnza. l'importnza pari a RunningAppProcessInfo.IMPORTANCE_FOREGROUND sembra mostrare quale attività è triggersmente osservata dall'utente. C'è anche RunningAppProcessInfo.IMPORTANCE_VISIBLE che è più basso, ma potrebbe valere la pena di verificare.

    controlla la mia soluzione per determinare se un'attività è in primo piano: http://www.mannaz.at/codebase/android-activity-foreground-surveillance/

    Dovrebbe essere facile ripristinare la logica da "in primo piano" a "non in primo piano".

    Ho implementato un BroadcastReceiver che viene triggersto da AlarmManager. L'AlarmManager viene inizializzato su BOOT_COMPLETED. Quindi devo dichiarare il ricevitore nel manifesto.

    Il mio problema è che voglio che BroadcastReceiver funzioni solo quando nessuna delle mie attività è in primo piano (anche se l'utente non interagisce con la mia applicazione). Tiri le informazioni da un server remoto e non voglio informare l'utente se è attualmente nella mia applicazione.

    Finora non sono riuscito a trovare un modo per determinare se la mia applicazione è in primo piano. C'è un modo per fare una cosa del genere? ActivityManager mi dice se la mia applicazione è in esecuzione ma non se è in primo piano.

    Non sembra essere un modo diretto per determinare se una delle tue attività è l'attività corrente in esecuzione corrente. Tuttavia, è ansible get l'effetto desiderato utilizzando una trasmissione ordinata e due ricevitori broadcast. Un ricevitore broadcast deve essere registrato in OnResume () e non registrato in OnPause (). Il secondo ricevitore di trasmissione verrà dichiarato nel tuo manifesto come già fatto. Impostare l'android: priorità per i ricevitori in modo tale che se il ricevitore registrato dynamicmente è registrato, riceverà l'intento in primo luogo, quindi è ansible mangiare l'intento in modo che il ricevitore di trasmissione registrato nel tuo manifesto non viene mai notificato.

    È ansible verificare se la window ha la messa a fuoco – ma come indicato nei documenti dev, questo non è lo stesso come se l'attività sia in primo piano.

    Utilizzoi ActivityLifecycleCallbacks per get una soluzione molto più pulita.

    Può essere insicuro, leggere questo prima di decidere di utilizzare l'esempio riportto di seguito nella produzione. Funziona nello "sviluppo domestico" per il mio dispositivo e la versione OS.

     public class App extends Application implements Application.ActivityLifecycleCallbacks { private boolean inForeground; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityResumed(Activity activity) { inForeground = activity instanceof YourActivity; } public boolean isInForeground() { return inForeground; } 

    Registra App in AndroidManifest :

     <application android:name=".App" /> 

    E l'ultimo pezzo del puzzle:

     public class YourReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { App app = (App) context.getApplicationContext(); if(app.isInForeground()){ // do some stuff } } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.