6

Ho un'attività in background che vorrei gestire. Il fatto è che quando l'attività termina, vorrei chiamare una nuova attività per mostrare il risultato all'utente, solo se la mia attività principale è visualizzata, altrimenti vorrei inviare solo una notifica in modo che l'utente possa vedere che l'azione completato, ed essere in grado di aprirlo quando vuole.Mostra una notifica solo se Attività non viene visualizzata

Stavo pensando di utilizzare un servizio per gestire l'avvio e la conclusione dell'attività in background e trasmettere un messaggio al termine, ma in questo caso non ho alcuna possibilità di sapere se l'attività è stata mostrata o se la trasmissione non è stata elaborata e dovrei inviare una notifica.

Quindi questo è il mio problema, e perché la mia conoscenza ed esperienza in compiti e servizi in background è limitata ho deciso di chiedere aiuto.

Grazie in anticipo per la lettura il mio caso, la speranza per qualche aiuto!

risposta

23

Ecco un buon articolo che descrive come implementare ciò che si vuole: Activity or Notification via Ordered Broadcast.

L'idea principale è utilizzare le trasmissioni ordinate. Dovresti creare uno BroadcastReceiver che vivrà senza attività. Per fare ciò è necessario dichiararlo nel file AndroidManifest.xml. Questo ricevitore mostrerà un Notification. Inoltre, dovresti registrare un altro BroadcastReceiver con priorità più alta nella tua attività principale che visualizzerà qualcosa sullo schermo. Quindi devi solo inviare una trasmissione ordinata.

+0

Questa è stata una possibile risposta che ho scoperto dopo aver postato la domanda e sembra davvero una buona pratica. Il collegamento è davvero utile, grazie mille. Penso che questo sia il modo in cui seguirò! – akalipetis

+3

super elegante e funziona bene! – Orr

+0

@Antonis: puoi fornire un codice per come lo implementiamo? – Sam

2

Provare così.

private static boolean isInForeground; 

onResume(){ 
    isInForground = true; 
} 
onPause(){ 
    isInForground = false; 
} 

se isInForground è true poi attività è in Forground (da) altrimenti non mostrare.

se volete sapere da qualsiasi luogo quindi aggiungere il seguente in MainActivity.

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    onResume(){ 
     pref = PreferenceManager.getDefaultSharedPreferences(this); 
     prefEditor = prefs.edit(); 
     prefEditor.putBoolean("isInForeground",true); 
     prefEditor.commit(); 
    } 

    onPause(){ 
      pref = PreferenceManager.getDefaultSharedPreferences(this); 
      prefEditor = prefs.edit(); 
      prefEditor.putBoolean("isInForeground", false); 
      prefEditor.commit(); 
    } 

Quindi dal vostro servizio.

pref = PreferenceManager.getDefaultSharedPreferences(this); 
if(pref.getBoolean("isInForeground", false)){ 
     //MainActivity is in forground 

} 
else{ 
     //not in forground 
} 
1

Sembra che si desidera implementare il compito in un thread da un servizio. È possibile avere un valore booleano statico persistente nell'attività che indica se viene mostrata l'attività. Un'attività è visibile all'utente in onResume() e non è visibile ogni volta che viene chiamato onPause(). Imposta il valore booleano su true in onResume() e false in onPause().

0

è possibile utilizzare SharedPreferences; aggiorna le preferenze su un'attività quando è onStart() o onStop() e basta verificarlo nel tuo servizio.

Spero di poterti aiutare.