在我的应用程序中,我将我的服务放在前台,以防止它被使用:
杀死startForeground(NOTIFY_ID, notification);
这也会向用户显示通知(这很棒)。问题是以后我需要更新通知。所以我使用代码:
notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent);
mNotificationManager.notify(NOTIFY_ID, notification);
接下来的问题是:这样做会不会使服务脱离其特殊的前景状态?
在this answer中,CommonsWare表示此行为是可行的,但他不确定。那么有人知道实际的答案吗?
注意:我知道解决这个问题的一个简单方法是每次要更新通知时重复调用startForeground()
。我想知道这种替代方案是否也有效。
答案 0 :(得分:12)
澄清这里所说的内容:
据我了解,如果您取消通知服务 将停止作为前台服务,所以请记住这一点;如果你 取消通知,您需要再次调用startForeground() 恢复服务的前台状态。
答案的这一部分表明,通过在Notification
上使用Service
,NotificationManager.cancel()
可以删除正在进行的Notification
集。
这不是真的。
使用startForeground()
无法删除NotificationManager.cancel()
设置的持续通知。
删除它的唯一方法是调用stopForeground(true)
,这样就会删除正在进行的通知,这也会使Service
停止在前台。所以它实际上是另一种方式;由于Service
被取消,Notification
不会停在前台,Notification
只能通过停止Service
位于前台来取消。
当然可以立即调用startForeground()
,然后使用新的Notification
恢复状态。如果必须再次显示滚动条文本,您可能希望这样做的一个原因,因为它只会在第一次显示Notification
时运行。
此行为未记录在案,我浪费了4个小时试图找出无法删除Notification
的原因。
有关此问题的更多信息,请访问:NotificationManager.cancel() doesn't work for me
答案 1 :(得分:11)
Android开发者网站上的RandomMusicPlayer应用使用NotificationManager来更新前台服务的通知,因此保留前景状态的可能性非常大。
(请参阅MusicService.java类中的setUpAsForeground()和updateNotification()。)
据我了解,如果您取消通知,该服务将停止作为前台服务,请记住这一点;如果取消通知,则需要再次调用startForeground()以恢复服务的前台状态。
答案 2 :(得分:3)
如果要更新startForeground()设置的通知,只需构建新通知,然后使用NotificationManager通知它。
关键是使用相同的通知ID。
更新通知不会将服务从前台状态中删除(这只能通过调用stopForground来完成);
示例:
private static final int notif_id=1;
@Override
public void onCreate (){
this.startForeground();
}
private void startForeground() {
startForeground(notif_id, getMyActivityNotification(""));
}
private Notification getMyActivityNotification(String text){
// The PendingIntent to launch our activity if the user selects
// this notification
CharSequence title = getText(R.string.title_activity);
PendingIntent contentIntent = PendingIntent.getActivity(this,
0, new Intent(this, MyActivity.class), 0);
return new Notification.Builder(this)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.ic_launcher_b3)
.setContentIntent(contentIntent).getNotification();
}
/**
this is the method that can be called to update the Notification
*/
private void updateNotification() {
String text = "Some text that will update the notification";
Notification notification = getMyActivityNotification(text);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notif_id, notification);
}