Ho un IntentService che carica un file. Tutto funziona bene, ma sono un po 'confuso su come gestire le notifiche. Quando avvio la notifica, utilizzo startForeground()
perché i file possono essere piuttosto grandi e non voglio che il caricamento venga ucciso a meno che non sia assolutamente necessario. Quando uso startForeground()
visualizza due notifiche nell'area di notifica (uno sotto in corso e un'altra in Notifiche):Come gestire correttamente startForegrounds due notifiche
che ho letto attraverso una serie di diversi posti di overflow dello stack e articoli web, ma nessuno di loro rispondono alla domanda che ho ... spero di non aver perso uno che parla di questo.
È a mia conoscenza che la notifica in corso nell'immagine sopra (quella senza la barra di avanzamento) viene inserita poiché è in esecuzione in primo piano (Services documentation). Va tutto bene se me lo chiedi, e capisco perché. Tuttavia, non ho bisogno di due notifiche visualizzate e sono abbastanza sicuro che la maggior parte delle persone non vorrebbe che due notifiche ingombrino l'area di notifica. Mi piacerebbe sapere come gestire correttamente la notifica in modo che solo uno schermo e non ingombrare l'area di notifica.
L'unico modo in cui sono stato in grado di aggirare questo è se ho impostato l'ID intero per startForeground (int id, Notification notification)
(ONGOING_NOTIFICATION_ID
nel mio codice qui sotto) a zero. Tuttavia, la documentazione cito sopra dice:
Caution: The integer ID you give to startForeground() must not be 0
Impostandola a 0 disabilita la notifica in corso e poi basta mostra la notifica regolare con la barra di avanzamento. Immagino di poter "sistemare" questo problema impostando .setOngoing(true)
fino a quando non è stato completato il caricamento del file e quindi l'impostazione di .setOngoing(false)
una volta terminata, in modo che possa essere chiusa. Non sono sicuro di come si debba essere "cauti" con l'impostazione dell'ID intero su 0. Per me sembra un modo pigro per essere in grado di aggirare il problema che sto avendo, ma non lo faccio sapere se ci sono altre conseguenze per impostarlo su 0. Inoltre, questo funziona solo se ho solo una notifica con cui ho a che fare. Se ho più notifiche diverse, allora avrò bisogno di ID diversi per ognuno e questo non funzionerà. Aggiornamento: Sembra setting the ID to 0 won't work in Android 4.3, quindi ora torno al punto di partenza.
Qual è un modo valido per andare in giro visualizzando entrambe le notifiche?
Aggiornamento/Soluzione: Duh, prendersi un po 'di tempo libero e poi tornare a questo e ricontrollare ciò che avevo fatto in base alla raccomandazione di @dsandler mi ha aiutato a capire cosa stavo facendo male. Non stavo impostando l'ID corretto quando stavo facendo l'aggiornamento del progresso, ecco perché stava creando due notifiche e una non veniva aggiornata. L'utilizzo dello stesso ID (ONGOING_NOTIFICATION_ID) per tutte le notifiche ha risolto il problema per me. Vedere il codice qui sotto per i pezzi aggiuntivi che non avevo incluso prima e dove avevo commesso l'errore.
codiceRilevante da UploadFile.java:
public class UploadFile extends IntentService {
private static final int ONGOING_NOTIFICATION_ID = 1;
@Override
protected void onHandleIntent(Intent intent) {
mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle(getText(R.string.upload))
.setContentText("0% " + getText(R.string.upload_in_progress))
.setSmallIcon(android.R.drawable.stat_sys_upload);
startForeground(ONGOING_NOTIFICATION_ID, mBuilder.build());
....
if (progress > 0){
percent = (Long.valueOf(progress) * 100)/totalSize;
mBuilder.setProgress(100, percent.intValue(), false);
mBuilder.setContentText(percent.intValue() + "% " + getText(R.string.upload_in_progress));
mNotifyManager.notify(ONGOING_NOTIFICATION_ID, mBuilder.build()); // <-- My problem was that I had set the ID here to 0 and did not make it the same as the ID I set above
}
....
}
grazie per la risposta. Sono tornato indietro e ho ricontrollato quello che stavo facendo (che stava facendo ciò che mi hai consigliato) e mi sono reso conto che non stavo usando l'ID di notifica corretto quando ho postato i progressi. Ora funziona come un incantesimo! – Jason
Ho una domanda riguardante la notifica: quale icona dovrebbe essere usata per "setLargeIcon", se vuoi usare quella di Android (come hai fatto per "setSmallIcon")? –
Perché è necessario ** NotificationManager.notify **? 'startForegroundService()' mostra già la notifica. –