Wie die update-Benachrichtigung mit RemoteViews?
Ich erstelle eine Benachrichtigung mit RemoteViews
aus einer benutzerdefinierten Service
, die ausgeführt wird mit der Meldung im Vordergrund-Modus (wird, wird der Dienst bleibt aktiv, solange diese Meldung sichtbar ist, Benutzer). Benachrichtigung eingestellt ist als die Laufende, so dass Benutzer kann nicht wischen Sie es ab.
Möchte ich ändern, zum Beispiel bitmap angezeigt, in ImageView
enthaltenen remote-Ansicht das layout oder ändern von text-Wert in einen TextView
. Layout in der remote-Ansicht mit XML-layout-Datei.
Mein problem ist, dass, sobald die Benachrichtigung wird erstellt und sichtbar für Benutzer, wenn ich anrufen RemoteViews
's Funktionen wie setImageViewResource()
zu ändern Bitmap
zeigt sich in einer ImageView
, die änderung ist nicht sichtbar, es sei denn, ich tun rufen Sie setImageViewResource()
rufe ich hinterher:
NotificationManager.notify( id, notification );
oder
Service.startForeground(id,notification);
Dies klingt nicht richtig für mich, obwohl. Ich kann nicht glauben, dass Sie zu aktualisieren RemoteViews
UI in eine Benachrichtigung, die Sie bereits erstellt, ich habe zu re-initialisieren Benachrichtigung. Wenn ich Button
Kontrolle in einer Mitteilung, es aktualisiert sich selbst auf berühren und loslassen. Also es muss ein Weg gefunden werden, dies richtig tun, aber ich weiß nicht, wie.
Hier ist mein code, die erstellt Benachrichtigung in meinem Service
Beispiel:
this.notiRemoteViews = new MyRemoteViews(this,this.getApplicationContext().getPackageName(),R.layout.activity_noti1);
Notification.Builder notibuilder = new Notification.Builder(this.getApplicationContext());
notibuilder.setContentTitle("Test");
notibuilder.setContentText("test");
notibuilder.setSmallIcon(R.drawable.icon2);
notibuilder.setOngoing(true);
this.manager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
this.noti = notibuilder.build();
this.noti.contentView = this.notiRemoteViews;
this.noti.bigContentView = this.notiRemoteViews;
this.startForeground(NOTIFICATION_ID, this.noti);
Und Funktion, die 'Kräfte' UI-änderungen-Benachrichtigung:
public void updateNotiUI(){
this.startForeground(NOTIFICATION_ID, this.noti);
}
Innerhalb MyRemoteViews
Klasse, wenn erforderlich, ich mache das, um änderungen an UI:
this.setImageViewResource(R.id.iconOFF, R.drawable.icon_off2);
this.ptMyService.updateNotiUI();
Kann mir jemand sagen, was ist die richtige Art der Aktualisierung UI-Komponenten einer RemoteViews
in der Meldung?
InformationsquelleAutor Sinisa | 2014-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein detail-Beispiel für die update-Benachrichtigung mit
RemoteViews
:Layout für die Benachrichtigung, also
res/layout/custom_notification_small.xml
:Hoffe, dieses Beispiel hilft Ihnen, eine Menge!
HINWEIS: Sie können nicht aktualisieren Sie die benutzerdefinierte
NotificationCompat
auf pre-Honeycomb, also habe ich eine alternative Möglichkeit zum update auf pre-Honeycomb, D. H. der überprüfung der API-Ebene der ersten, und verwenden Sie die veraltetNotification
statt.siehe meine Antwort wieder. Ich habe aktualisiert, so dass Sie besser zu verstehen.
die einzige funktionierende Lösung für startForeground() RemoteView Benachrichtigung zu aktualisieren. Genial Antwort.
Super!!! und komplette Antwort! danke dafür 🙂
Hey Ihr mir dieser Fehler android.app.RemoteServiceException: Bad notification posted aus dem Paket com.areel.android: Konnte nicht erweitert werden, RemoteViews für: StatusBarNotification(pkg= "com".areel.android user=UserHandle{0} id=1234-tag=null key=0|com.areel.android|1234|null|10432: Benachrichtigung(pri=0 contentView=com.areel.android/0x7f0b0044 vibrieren=null sound=null tick-defaults= " 0x0 " flags=0x62 color=0x00000000 vis=PRIVAT))
InformationsquelleAutor Anggrayudi H
Würden Sie anrufen
NotificationManager.notify(id, notification)
zu lassen Benachrichtigungssystem wissen, dass Sie möchten, aktualisieren Sie die-Benachrichtigung anzeigen. Hier ist der Google docs link http://developer.android.com/training/notify-user/managing.html.Haben, eine Methode, die zurückgibt, Notification-Objekt.
Beachten Sie auch, dass
bigContentView
undRemoteViews
sind nicht komplett neu. Wenn einige der Elemente der bigContentView hat die Sichtbarkeit eingestelltGONE
, und wenn Sie wollen, zu zeigen, dass es das nächste mal, müssen Sie explizit festlegen, SichtbarkeitVISIBLE
.InformationsquelleAutor Froyo
ACHTUNG!
Der einzig richtige Weg, um die update-Benachrichtigung zu neu RemoteViews vor jeder NotificationManager#informieren. Warum? Es ist ein memory-leak führt zu TransactionTooLargeException, wie es berichtet wurde, in denen Fragen:
Jeder Anruf auf RemoteViews wie setViewVisibility(...) und so weiter fügt entsprechende Aktion queue von Aktionen angewendet werden sollen. Nach Benachrichtigen Sie die remote-Ansicht ist aufgeblasen und Maßnahmen auch tatsächlich umgesetzt werden. Aber die Schlange wird nicht gelöscht!
Werfen Sie einen Blick auf den screenshot getroffen beim debugging in diesem Fall.
Da ich aktualisiere audio-player Benachrichtigung mit den Daten aus dem ViewModel. Die Anwendung wird angehalten, auf Linie #81, und Sie können sehen, die RemoteViews Instanz, die Reihe von Aktionen mit Größe 51! Aber ich habe nur gewechselt Audiospur zweimal und drückte pause! Natürlich musste ich beobachten, Absturz der Anwendung mit TransactionTooLargeException nach einer Weile.
Flachen Forschung bestätigt, es gibt keine öffentliche API, auf die direkt oder indirekt klaren Aktionen Warteschlange, so dass der einzige Weg, um die update-Benachrichtigung anzeigen zu halten seinen Zustand getrennt und neu RemoteViews Instanz übergeben, um Benachrichtigung.Generator, wie auch immer, das nicht überladen UI-thread eine Menge
InformationsquelleAutor Max Elkin
Nicht speichern
Notification
Objekt, aber dieNotification.Builder
Objekt. Produzieren neue Meldung, jedes mal, bevor Sie es zuInformationsquelleAutor dykzei eleeot