Modello di design per azione alternativa se app in primo piano?
-
20-12-2019 - |
Domanda
Sto costruendo un'azione che utilizza Google Cloud Messaging per ricevere notifiche push.
Questo comporta un coppia componenti notevoli, vale a dire:
- .
- A
WakefulBroadcastReceiver
per ricevere il messaggio da GCM. - un
IntentService
da avvisare quando viene ricevuto un evento GCM.
Poiché sono sicuro che è il caso per molte applicazioni, vorrei prendere un approccio diverso per quando l'applicazione ha un'attività in primo piano vs. quando l'applicazione è non avere unApplicazione in primo piano.
Vorrei pubblicare una notifica al cassetto di notifica se l'applicazione non è attiva e inoltre inoltre l'evento sull'attività in primo piano se l'applicazione è attiva.
C'è un modello di design per questo?Come dovrei andare a determinare se l'app è in primo piano vs. Lo sfondo?
Soluzione
Puoi seguire un approccio come indicato in Questo blogPost Dove si crea un BroadcastReceiver
nel tuo Activity
con una priorità positiva (cioè superiore al predefinito di 0
) che intercetta un'azione specifica e quindi chiama abortBroadcast
: maneggia la custodia APP.Quindi registrati anche un BroadcastReceiver
nel tuo manifest che gestisce la stessa azione ma alla priorità predefinita: questo è il fallback se l'app non è aperta e crea la notifica del sistema.
Si utilizza quindi sendOrderedBroadcast()
per inviare la trasmissione a tutti i ricevitori registrati in ordine prioritario.Se l'attività è aperta, il primo lo gestirà.Altrimenti, è predefinito all'altro e creerà una notifica.
Altri suggerimenti
Il modo in cui suggerisco di farlo è come segue.
Avere tutta la logica per quanto riguarda GCM in un servizio (non ho mai usato IntentService
, quindi non so di è coraggio, ma lo vedo eredita da Service
).
Nella tua attività, probabilmente hai un modo di avviare il servizio (forse l'utente si attiva attraverso un pulsante), niente di nuovo qui.
Qui arriva la parte divertente. Nella tua attività gestisci onPause()
e onResume()
. In onResume()
Bind al servizio. Con il meccanismo di rilegatura puoi ottenere un puntatore al tuo servizio e far sapere che sei lì " Hey Service, sono un'attività e sono qui ... Si prega di conservare un puntatore per me da qualche parte "e il servizio memorizza un puntatore all'attività (chiamiamolo mActivity
). Nel onPause()
notifica al servizio che stai andando, quindi il servizio imposta mActivity = null
, e quindi Bind dal servizio.
Con questo meccanismo, ogni volta che il servizio riceve una notifica push, prova la variabile mActivity
per vedere se c'è un'attività legata. Con un puntatore alla tua attività puoi invocare tutti i suoi metodi, inoltrare informazioni ...