我创建了一个发送电子邮件的服务(EmailService)...每次我需要通过我的应用程序发送电子邮件时,它会启动服务并通过意图传递电子邮件的ID ...
我正在使用startforeground(id_of_email, mynotifcation);
来阻止它被杀死,并向用户显示电子邮件发送状态的通知。
我需要允许用户当时发送多封电子邮件,因此当用户需要发送另一封电子邮件时,它会再次使用新意图(不同的电子邮件ID)调用startservice
...所以它再次致电startforeground(new_id_of_email, mynotifcation);
。
问题是对startforeground
的新调用会覆盖先前的通知...(因此用户丢失了先前的通知,并且不知道他之前的电子邮件发生了什么)
答案 0 :(得分:3)
查看Service.startForeground()
来源显示,对startForeground的多次调用只会替换当前显示的通知。实际上,对startForeground的调用与stopForeground()
相同,只有removeNotification
设置始终设置为true。
如果您希望服务显示正在处理的每封电子邮件的通知,则必须从服务中单独管理每个通知。
public final void startForeground(int id, Notification notification) {
try {
mActivityManager.setServiceForeground(
new ComponentName(this, mClassName), mToken, id,
notification, true);
} catch (RemoteException ex) {
}
}
public final void stopForeground(boolean removeNotification) {
try {
mActivityManager.setServiceForeground(
new ComponentName(this, mClassName), mToken, 0,
null, removeNotification);
} catch (RemoteException ex) {
}
}
答案 1 :(得分:2)
也可以使用STOP_FOREGROUND_DETACH
标志。
STOP_FOREGROUND_DETACH
在API级别24中添加int STOP_FOREGROUND_DETACH标记为 stopForeground(int):如果设置,则先前提供的通知 startForeground(int,Notification)将与服务分离。 只有当没有设置STOP_FOREGROUND_REMOVE时才有意义 - 在此 例如,通知将保持显示,但完全分离 来自服务,因此不再通过直接呼叫进行更改 通知经理。
常数值:2(0x00000002)
因此,在重复拨打startForeground()
之前,您可以致电stopForeground(STOP_FOREGROUND_DETACH);
。这将分离通知,并且重复拨打startForeground()
不会对其进行修改,如果您使用其他通知ID。
此外,"分离"通知,现在,不代表正在进行的服务"因此,用户可以通过滑动删除。
奖励:
为了兼容性,可以使用ServiceCompat
类及其static
方法ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)
,如文档here所述。
答案 2 :(得分:0)
我创建了一个实用程序类,用于基于@zeekhuge的答案来管理前台服务通知。您可以在这里找到代码段:https://stackoverflow.com/a/62604739/4522359