У меня есть служба мультимедиа, которая использует startForeground () для отображения уведомления при запуске воспроизведения. У него есть кнопки паузы / остановки во время воспроизведения, кнопки воспроизведения / остановки во время паузы.
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);
}
Проблема здесь в том, что когда я показываю / обновляю уведомление в приостановленном состоянии, вам должно быть разрешено его удалить. mBuilder.setOngoing(false)
, похоже, не имеет никакого эффекта, поскольку предыдущий startForeground
отменяет его.
Вызов stopForeground(true);
с тем же кодом работает должным образом, но уведомление мигает, поскольку оно уничтожается и создается заново. Есть ли способ «обновить» уведомление, созданное из startForeground, чтобы его можно было удалить после вызова stop?
Изменить: Вот полный код, создающий уведомление, согласно запросу. createNotification вызывается всякий раз, когда служба воспроизводится или приостанавливается.
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);
}
Последующее изменение:
В одном из комментариев ниже упоминается, что ответ может быть «хрупким», и с момента выпуска Android 4.3 поведение startForeground
изменилось. startForeground заставит ваше приложение отображать уведомление, находясь на переднем плане, и метод должен просто вызываться с отображаемым уведомлением. Я не тестировал, но принятый ответ может больше не работать должным образом.
В плане остановки перепрошивки при вызове stopForeground
бороться за фреймворк не стоит.
Есть некоторые дополнительную информацию об изменении уведомлений Android 4.3 здесь.
setOngoing(false)
? Я подозреваю, что уведомление не перестраивается, чтобы принять изменения, но по этому фрагменту трудно сказать. - person dsandler   schedule 25.03.2013