2014-04-24 14 views
7

voglio emulare il comportamento app di Gmail per quanto riguarda le notifiche della barra di notifica, che rispetta il modello Android consigliata: http://developer.android.com/design/patterns/notifications.htmlCome tenere traccia delle notifiche di sapere quando mostrare una notifica di sintesi

volta l'applicazione è in background e io ottenere una nuova e-mail ricevo una notifica nella barra di notifica in questo modo:

Line 1 : Jane Smith 
Line 2 : Hi John, this is a sample message... 

cioè, una notifica che è specifico per un singolo messaggio, e toccando porta a una schermata che mostra che l'e-mail specifica . Se si cancella la notifica o facendo scorrere il dito o con "Cancella tutto", quando ricevo un nuovo messaggio otterrò un'altra notifica specifica per singolo messaggio. Ma se non lo elimino e ottengo un'altra e-mail, la notifica si trasformerà in una notifica di riepilogo che dice "2 nuovi messaggi", e toccandola si arriva alla casella di posta in arrivo.

So come aggiornare una notifica, la domanda è come faccio a capire quali notifiche sono ancora lì nella barra di notifica, se presente. La risposta non è così semplice perché la notifica non riflette il numero di messaggi non letti che ho, deve riflettere quali messaggi non vengono ancora riconosciuti dall'utente toccando la notifica o cancellandola.

Devo tenere traccia delle notifiche mantenendo un elenco di notifiche che abbiamo lanciato, quelle che sono state intercettate (intento contenuto) e quelle cancellate (elimina intenti)? Non credo che questo approccio sia sufficientemente sicuro da errori ... ad esempio: cosa succede se le notifiche vengono cancellate perché avvio il mio telefono? Dove dovrei tenere traccia delle notifiche che continuano a essere visualizzate? Preferenze condivise?

Come si risolve di solito?

risposta

11

Ho appena avuto lo stesso problema e ho anche esaminato Gmail per il comportamento appropriato. Ho studiato i seguenti scenari:

Supponendo che un utente sta attivamente utilizzando l'applicazione Gmail (ignorare qualsiasi interazione con la versione del browser), e poi naviga lontano da:

  1. Da quel momento in poi, se il l'utente riceve una nuova email, riceverà una notifica.
  2. Se la notifica è ancora presente e l'utente riceve una nuova e-mail, la notifica verrà aggiornata a un riepilogo contenente il titolo delle N più recenti e-mail dall'ultima volta che l'utente ha utilizzato l'app.
  3. Se l'utente chiude la notifica e arriva un'altra email, viene emessa un'altra notifica di riepilogo.
  4. Se l'utente torna indietro nell'app (facendo clic sulla notifica o meno), tutte le notifiche esistenti vengono eliminate.

In API 18, Android Aggiunto il supporto per recuperare le notifiche attive utilizzando NotificationListenerService, tuttavia, che è troppo recente per l'applicazione su cui sto lavorando (min API 14), per non parlare non si può contare da quello di ottenere le informazioni di notifica esistenti se sono già state archiviate dall'utente.

Quindi la soluzione che ho trovato era quella di mantenere le informazioni sulle notifiche già rilasciate localmente, utilizzare tali informazioni per creare una singola notifica o un riepilogo e cancellare tutto quando l'utente apre nuovamente l'app.

a persistere le informazioni di notifica, ho creato un semplice modello simile al seguente:

public class NotificationBundle { 
    private String mText; 
    // Add any other relevant information about your notification here, 
    // particularly what you used to create your notification intent 
    // i.e. an item/message id to highlight, maybe? 

    public String getText() { 
     return mText; 
    } 

    public void setText(final String text) { 
     mText = text; 
    } 
} 

L'idea è di creare un'istanza di quelli per ogni notifica si emette.

Quindi è necessario disporre di un modo per mantenere l'elenco degli oggetti NotificationBundle. Ho usato SharedPreferences per farlo, ma potevi usare qualsiasi altra cosa che ti si addice meglio (come una tabella DB). Per mantenere un List<NotificationBundle> in SharedPreferences ho utilizzato Gson per serializzare l'array in json e quindi salvato come stringa. Supponendo che tu possa usare SharedPreferences, puoi trovare come eseguire la serializzazione in questo answer.

Con tale struttura sul posto, in fondo ciò che resta da fare per voi è:

  • Quando si deve emettere una notifica:

    1. Creare un nuovo NotificationBundle con le informazioni che si desidera notificare.
    2. recuperare il esistente List<NotificationBundle> da SharedPreferences
    3. Se l'elenco dei bundle è vuota, si emetterà una singola notifica. In caso contrario, fornirai un riepilogo: in questo caso puoi utilizzare l'elenco di pacchetti per costruire il contenuto del tuo sommario. Un buon articolo sulle notifiche di riepilogo è [Utilizzo di stili di visualizzazione grandi].
    4. aggiungere il nuovo NotificationBundle (dal 1 ) nella vostra attuale List<NotificationBundle> (da) e salvarlo SharedPreferences.
    5. Emettere la notifica utilizzando NotificationManager.notify(). Se utilizzi sempre la stessa notifica id qui, creerà una nuova notifica se nessuno dalla tua app è attualmente visibile, o lo aggiornerà solo se è visibile una notifica precedente.
  • Sul onResume() metodo della vostra attività principale, assicuratevi di eliminare tutte le notifiche con NotificationManager.cancelAll(). Assicurati inoltre di rimuovere dal tuo SharedPreferences il tuo List<NotificationBundle> esistente.

E quello dovrebbe fare il trucco.

+0

@fekke puoi contrassegnare come risposta se ha funzionato per te? Grazie :) –

0

Se si salva l'ID della notifica di riepilogo, è possibile inviare un altro con quell'ID e non avrà alcun effetto se la notifica esiste già con lo stesso titolo, quando la data ecc ... e se non è stata notificata è presente ne verrà creato uno nuovo.

Problemi correlati