- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个媒体服务,它使用 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
时停止闪烁方面,我认为不值得为框架而战。
有一些 additional information on the Android 4.3 notification change here .
最佳答案
您可以考虑使用不同的方法。
由于您应该为此类任务(媒体播放)使用前台服务,我建议您继续执行 start foreground()
,但不要将通知传递给它,只需设置 id 0 和通知 null 像这样 startForeground(0, null);
.
这样前台服务不会显示任何通知。
现在,出于您的目的,您可以使用常规通知并更新它们的状态(持续、布局、文本等),这样您就不必依赖前台服务的通知行为。
希望这会有所帮助。
关于android - 允许在调用 stopForeground(false) 后取消通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610399/
我使用通知 ID 启动了一个前台服务,但是当我尝试调用 stopForeground(false) 时,该服务正在重新启动。但根据 android 文档,调用此方法不会停止服务。 @Override
我目前正在尝试制作某种音乐播放器应用程序。为了播放,我创建了一个单独的服务。因为我想让它一直播放,所以我调用了 Service.startForeground()。在为 Android O(SDK 级
代替 stopForeground(true) 打电话, stopForeground(false) 应按原样保留通知(没有正在进行的状态),除非它被用户关闭/以编程方式删除。这也应该可以防止通知闪烁
我有一个媒体服务,它使用 startForeground() 在播放开始时显示通知。播放时有暂停/停止按钮,暂停时有播放/停止按钮。 NotificationCompat.Builder mBuild
我正在尝试停止我的前台服务,但我的代码似乎无法正常工作 Intent intent = new Intent(SplashScreenActivity.this, DNSService.class);
我想在我的前台服务被销毁后删除一个通知。我尝试从 onDestroy() 和 unbind() 调用 stopForeground(true)。尽管调用了 onUnbind() 和 onDestroy
我是一名优秀的程序员,十分优秀!