多次调用startforeground?

15

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

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

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

问题在于对startforeground的新调用覆盖了先前的通知...这样用户就会丢失先前的通知,并且不知道他之前的电子邮件的情况。


把任务排队到数据库里或者其他地方会不会更好呢?这样,一旦第一个任务完成,服务就会将其更新为已完成或删除它,并检查是否有其他任务需要完成。也许可以使用消息队列来不断向服务提供更多的任务。 - eduyayo
3个回答

7

查看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


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),如此处所述。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接