更新通知是否会删除服务的前台状态?

时间:2011-11-27 23:24:03

标签: android android-service android-notifications

在我的应用程序中,我将我的服务放在前台,以防止它被使用:

杀死
startForeground(NOTIFY_ID, notification);

这也会向用户显示通知(这很棒)。问题是以后我需要更新通知。所以我使用代码:

notification.setLatestEventInfo(getApplicationContext(), someString, someOtherString, contentIntent);
mNotificationManager.notify(NOTIFY_ID, notification);

接下来的问题是:这样做会不会使服务脱离其特殊的前景状态?

this answer中,CommonsWare表示此行为是可行的,但他不确定。那么有人知道实际的答案吗?


注意:我知道解决这个问题的一个简单方法是每次要更新通知时重复调用startForeground()。我想知道这种替代方案是否也有效。

3 个答案:

答案 0 :(得分:12)

澄清这里所说的内容:

  

据我了解,如果您取消通知服务   将停止作为前台服务,所以请记住这一点;如果你   取消通知,您需要再次调用startForeground()   恢复服务的前台状态。

答案的这一部分表明,通过在Notification上使用ServiceNotificationManager.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);
}