Ich habe einen IntentService, der eine Datei hochlädt. Alles funktioniert gut, aber ich bin ein wenig verwirrt darüber, wie mit den Benachrichtigungen umzugehen ist. Wenn ich die Benachrichtigung starte, benutze ich startForeground()
, weil die Dateien ziemlich groß sein können und ich möchte nicht, dass der Upload getötet wird, wenn es absolut notwendig ist. Wenn ich startForeground()
verwenden zeigt es zwei Meldungen im Infobereich (ein unter Laufende und einem unter Notifications):Wie startForegrounds zwei Benachrichtigungen korrekt behandeln
ich durch eine Reihe von verschiedenen Stack-Überlauf-Beiträge und Web-Artikel gelesen haben, aber keiner von sie beantworten die Frage, die ich habe ... hoffentlich habe ich nicht einen vermisst, der über ths spricht.
Ich verstehe, dass die laufende Benachrichtigung im Bild oben (das ohne den Fortschrittsbalken) dort gesetzt wird, da dieser im Vordergrund läuft (Services documentation). Das ist alles gut und gut, wenn Sie mich fragen, und ich verstehe warum. Allerdings brauche ich nicht zwei Benachrichtigungen angezeigt und ich bin mir ziemlich sicher, dass die meisten Menschen nicht wollen, dass zwei Benachrichtigungen den Benachrichtigungsbereich überfluten. Ich würde gerne wissen, wie man die Benachrichtigung richtig behandelt, so dass nur eine angezeigt wird und den Benachrichtigungsbereich nicht überfüllt.
Die einzige Möglichkeit, die ich haben konnte, ist, wenn ich die Ganzzahl-ID für startForeground (int id, Notification notification)
(ONGOING_NOTIFICATION_ID
10 in meinem Code unten) auf Null setzen. Allerdings sagt die Dokumentation ich oben zitieren:
Caution: The integer ID you give to startForeground() must not be 0
auf 0 deaktiviert die laufende Benachrichtigung Einstellung und zeigt dann nur die regelmäßige Benachrichtigung mit dem Fortschrittsbalken. Ich denke, ich könnte das irgendwie "reparieren", indem ich .setOngoing(true)
setze, bis es fertig ist, die Datei hochzuladen und dann .setOngoing(false)
einzustellen, sobald es fertig ist, also kann es entlassen werden. Ich bin mir nicht sicher, wie genau "Vorsichtig" man sein muss, wenn man die Integer-ID auf 0 setzt. Für mich scheint es irgendwie ein fauler Weg zu sein, das Problem, das ich habe, zu umgehen, aber ich tue es nicht weiß, ob es weitere Konsequenzen für die Einstellung auf 0 gibt. Das funktioniert auch nur, wenn ich nur eine Benachrichtigung habe, mit der ich es zu tun habe. Wenn ich mehrere verschiedene Benachrichtigungen habe, brauche ich für jedes eine andere ID, und das funktioniert nicht. Update: Es sieht aus wie setting the ID to 0 won't work in Android 4.3, so jetzt bin ich wieder auf Platz eins.
Was ist ein gültiger Weg, um beide Benachrichtigungen anzuzeigen?
Update/Lösung: Duh, ich nahm mir eine Auszeit und kam dann zurück und überprüfte, was ich aufgrund der Empfehlung von @dsandler getan hatte, half mir herauszufinden, was ich falsch gemacht hatte. Ich habe die korrekte ID nicht festgelegt, als ich die Fortschrittsaktualisierung durchführte. Aus diesem Grund wurden zwei Benachrichtigungen erstellt und eine wurde nicht aktualisiert. Die Verwendung der gleichen ID (ONGOING_NOTIFICATION_ID) für alle Benachrichtigungen löste das Problem für mich. Sehen Sie den Code unten für die zusätzlichen Stücke, die ich vorher nicht eingeschlossen hatte und wo ich den Fehler gemacht hatte.
Relevante Code von 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
}
....
}
Dank für die Antwort. Ich ging zurück und überprüfte, was ich tat (was genau das tat, was Sie empfohlen hatten) und stellte fest, dass ich nicht die korrekte Benachrichtigungs-ID verwendete, wenn ich den Fortschritt posten wollte. Es funktioniert jetzt wie ein Zauber! – Jason
Ich habe eine Frage bezüglich der Benachrichtigung: Welches Symbol sollte für "setLargeIcon" verwendet werden, wenn Sie das von Android (wie Sie es für "setSmallIcon" getan haben) verwenden möchten? –
Warum wird ** NotificationManager.notify ** benötigt? 'startForegroundService()' zeigt bereits die Benachrichtigung an. –