4

我有一个音乐控制通知,允许用户开始/停止音乐。我想要与 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),通知会很快被删除,然后再次添加,这会产生奇怪的闪烁。

如何在服务退出前台后获得可取消的通知,而无需删除然后再次添加通知?

4

1 回答 1

7

根据使用带有前台服务文档的 MediaStyle 通知

在 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+ 设备上滑动通知。

于 2017-04-24T20:05:29.697 回答