多次调用startforeground?

时间:2013-06-30 19:34:25

标签: android service

我创建了一个发送电子邮件的服务(EmailService)...每次我需要通过我的应用程序发送电子邮件时,它会启动服务并通过意图传递电子邮件的ID ...

我正在使用startforeground(id_of_email, mynotifcation);来阻止它被杀死,并向用户显示电子邮件发送状态的通知。

我需要允许用户当时发送多封电子邮件,因此当用户需要发送另一封电子邮件时,它会再次使用新意图(不同的电子邮件ID)调用startservice ...所以它再次致电startforeground(new_id_of_email, mynotifcation);

问题是对startforeground的新调用会覆盖先前的通知...(因此用户丢失了先前的通知,并且不知道他之前的电子邮件发生了什么)

3 个答案:

答案 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) {
    }
}

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/Service.java#Service.startForeground%28int%2Candroid.app.Notification%29

答案 1 :(得分:2)

也可以使用STOP_FOREGROUND_DETACH标志。

引用documentation

  

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