Mam usługę Media, która używa funkcji startForeground(), aby wyświetlać powiadomienia po rozpoczęciu odtwarzania. Posiada przyciski pauzy/zatrzymania podczas odtwarzania, przyciski odtwarzania/zatrzymania podczas pauzy.Zezwalaj na anulowanie powiadomienia po wywołaniu stopForeground (fałsz)
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
// setup...
Notification n = mBuilder.build();
if (state == State.Playing) {
startForeground(mId, n);
}
else {
stopForeground(false);
mNotificationManager.notify(mId, n);
}
Tutaj problemem jest to, kiedy pokazać/aktualizacji powiadomień w to przerwał stan, powinno być zabronione, aby ją usunąć. mBuilder.setOngoing(false)
wydaje się nie mieć żadnego wpływu, ponieważ poprzedni startForeground
przesłania go.
Wywołanie stopForeground(true);
z tym samym kodem działa zgodnie z oczekiwaniami, ale powiadomienie miga, ponieważ zostało zniszczone i ponownie utworzone. Czy istnieje sposób na "zaktualizowanie" powiadomienia utworzonego przez startForeground w celu umożliwienia usunięcia go po wywołaniu stop?
Edycja: Tutaj jest pełny kod tworzenia powiadomienia. createNotification jest wywoływany, gdy usługa jest odtwarzana lub wstrzymana.
private void createNotification() {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("No Agenda")
.setContentText("Live stream");
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
if (state == State.Playing) {
Intent pauseIntent = new Intent(this, MusicService.class);
pauseIntent.setAction(ACTION_PAUSE);
PendingIntent pausePendingIntent = PendingIntent.getService(MusicService.this, 0, pauseIntent, 0);
mBuilder.addAction(R.drawable.pause, "Pause", pausePendingIntent);
//mBuilder.setOngoing(true);
}
else if (state == State.Paused) {
Intent pauseIntent = new Intent(this, MusicService.class);
pauseIntent.setAction(ACTION_PAUSE);
PendingIntent pausePendingIntent = PendingIntent.getService(MusicService.this, 0, pauseIntent, 0);
mBuilder.addAction(R.drawable.play, "Play", pausePendingIntent);
mBuilder.setOngoing(false);
}
Intent stopIntent = new Intent(this, MusicService.class);
stopIntent.setAction(ACTION_STOP);
PendingIntent stopPendingIntent = PendingIntent.getService(MusicService.this, 0, stopIntent, 0);
setNotificationPendingIntent(mBuilder);
mBuilder.addAction(R.drawable.stop, "Stop", stopPendingIntent);
}
else
{
Intent resultIntent = new Intent(this, MainActivity.class);
PendingIntent intent = PendingIntent.getActivity(this, 0, resultIntent, 0);
mBuilder.setContentIntent(intent);
}
Notification n = mBuilder.build();
if (state == State.Playing) {
startForeground(mId, n);
}
else {
stopForeground(true);
mNotificationManager.notify(mId, n);
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void setNotificationPendingIntent(NotificationCompat.Builder mBuilder) {
Intent resultIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
}
Follow-up Edit:
Jeden z komentarzy poniżej wspomniano, że odpowiedź może być „kruche”, a od wydaniem Androida 4.3, zachowanie za startForeground
uległ zmianie. startForeground zmusi twoją aplikację, by pokazała powiadomienie na pierwszym planie, a metoda powinna zostać wywołana z powiadomieniem do pokazania. Nie testowałem, ale zaakceptowana odpowiedź może już nie działać zgodnie z przeznaczeniem.
Jeśli chodzi o zatrzymywanie migania podczas wywoływania stopForeground
, nie sądzę, że warto walczyć z tymi ramami.
Jest kilka additional information on the Android 4.3 notification change here.
Czy możesz pokazać swój kod, gdy próbujesz wywołać 'setOngoing (false)'? Podejrzewam, że powiadomienie nie jest przebudowywane, aby wykryć zmiany, ale trudno to stwierdzić z tego fragmentu. – dsandler
@dsandler Dodałem pełny kod dla createNotification(). –
Chciałbym również podkreślić, że obecnie testuję tylko Jellybean, obecnie 4.2.2 (emulator i telefon), gdzie ustawiam setOngoing (false). Również setOngoing (false) działa, gdy powiadomienie nie jest uruchamiane przez startForeground (i setOngoing (true) jest odkomentowane). –