3

我运行一个服务,该服务通过startForeground(int id, Notification notification) 配置为前台服务,我想更新此通知。我实现这一点的代码大致如下:

private void setForeground() {
    Notification foregroundNotification = this.getCurrentForegroundNotification();

    // Start service in foreground with notification

    this.startForeground(MyService.FOREGROUND_ID, foregroundNotification);
}

...

private void updateForegroundNotification() {
    Notification foregroundNotification = this.getCurrentForegroundNotification();

    // Update foreground notification

    NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(MyService.FOREGROUND_ID, foregroundNotification);
}

并根据服务状态生成通知:

private Notification getCurrentForegroundNotification() {
    // Set up notification info

    String contentText = ...;

    // Build notification

    if (this.mUndeliveredCount > 0) {
        String contentTitleNew = ...;

        this.mNotificationBuilder
        .setSmallIcon(R.drawable.ic_stat_notify_active)
        .setContentTitle(contentTitleNew)
        .setContentText(contentText)
        .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_stat_notify_new))
        .setNumber(this.mUndeliveredCount)
        .setWhen(System.currentTimeMillis() / 1000L)
        .setDefaults(Notification.DEFAULT_ALL);
} else {
        this.mNotificationBuilder
        .setSmallIcon(R.drawable.ic_stat_notify_active)
        .setContentTitle(this.getText(R.string.service_notification_content_title_idle))
        .setContentText(contentText)
        .setLargeIcon(null)
        .setNumber(0)
        .setWhen(0)
        .setDefaults(0);
    }

    // Generate Intent

    Intent intentForMainActivity = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intentForMainActivity, 0);

    // Build notification and return

    this.mNotificationBuilder.setContentIntent(pendingIntent);
    Notification foregroundNotification = this.mNotificationBuilder.build();

    return foregroundNotification;
}

问题是我的通知没有正确更新:当我启动服务在前台运行时,调用updateForegroundNotification()几次,this.mUndeliveredCount > 0然后再次调用this.mUndeliveredCount == 0,通知右下角的小通知图标不会消失,即使没有提供大图标。根据该类方法的文档,setSmallIcon(int icon)这种行为并不是完全预期的,NotificationBuilder其中指出如果指定了大图标,小图标应该只出现在右下角:

public Notification.Builder setSmallIcon (int icon)

设置小图标资源,用于表示状态栏中的通知。展开视图的平台模板将在左侧绘制此图标,除非还指定了大图标,在这种情况下,小图标将移动到右侧。

我在这里更新服务通知做错了什么?或者这是一个Android错误?

4

1 回答 1

0

在确定不是我的不当行为导致不需要的小通知图标后,我搜索并找到了上述错误的简单解决方法:

Notification通过我的方法更新时updateForegroundNotification(),我使用“重置”通知生成并更新我的通知 ID。“重置”通知配置如下:

this.mNotificationBuilder
    .setSmallIcon(0)
    .setContentTitle("Reset")
    .setContentText("Reset")
    .setLargeIcon(null)
    .setNumber(0)
    .setWhen(0)
    .setDefaults(0);

有了这样的通知,我打电话给

Notification resetForegroundNotification = this.getResetForegroundNotification();

this.mNotificationManager.cancel(MyService.FOREGROUND_NOTIFICATION_ID);
this.mNotificationManager.notify(MyService.FOREGROUND_NOTIFICATION_ID, resetForegroundNotification);

在执行预期的通知更新之前,不需要的右下角图标在下一个仅设置一个小图标的通知中消失。

于 2013-09-05T17:00:27.627 回答