我有一个音乐控制通知,允许用户开始/停止音乐。我想要与Google Play音乐应用通知完全相同的行为:播放音乐时,服务处于前台,通知无法取消,当音乐未播放时,服务不再在前台,通知可以是除去。它工作正常但是当我取消服务的前台时,通知会很快被删除,然后再重新出现。
这是我的代码,首先是我如何构建通知:
NotificationCompat.Builder notifBuilder =
new android.support.v7.app.NotificationCompat.Builder(getApplicationContext())
.setStyle(new android.support.v7.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(1, 2, 3)
.setShowCancelButton(true)
.setCancelButtonIntent(deletePendingIntent)))
.setSmallIcon(R.drawable.notif_logo)
.setColor(ResourcesCompat.getColor(getResources(), R.color.blue, getTheme()))
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setShowWhen(false);
notifBuilder.setContentIntent(pendingIntent);
notifBuilder.setDeleteIntent(deletePendingIntent);
以下是我开始和更新通知的方式:
private void showNotification(NotificationCompat.Builder notifBuilder, boolean foreground) {
if (foreground) {
startForeground(NOTIFICATION_ID, notifBuilder.build());
} else {
stopForeground(false);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, notifBuilder.build());
}
}
如果我使用stopForeground(false),则运行后通知仍然无法取消。如果我使用stopForeground(true),则会快速删除通知,然后再次添加,这会产生奇怪的闪烁。
如何在服务退出前台后取消通知,而不必删除然后再次添加通知?
答案 0 :(得分:2)
根据Using MediaStyle notifications with a foreground service documentation:
在Android 5.0(API级别21)及更高版本中,一旦服务不再在前台运行,您可以滑动通知以停止播放器。您不能在早期版本中执行此操作。要允许用户在Android 5.0(API级别21)之前删除通知并停止播放,您可以通过调用setShowCancelButton(true)和setCancelButtonIntent()在通知的右上角添加取消按钮。
您永远不需要致电setOngoing(false)
/ setOngoing(true)
,因为这取决于您的服务目前是否在前台。
根据Media Session Callbacks docs,当您的音乐暂停时,您应该被调用stopForeground(false)
- 这会删除前景优先级,并允许用户在API 21+设备上刷掉通知。