16

我有一个for看起来像这样的块:

for(int counter = 0; counter < sList.size(); counter++){
            String s = sList.get(counter);
            Notification notification = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText(s).setSmallIcon(R.drawable.ic_launcher).setContentIntent(pendingIntent).build();
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(counter, notification);
}

此块位于由警报管理器触发的服务中。所以这个块很可能在用户看到通知之前被执行了几次。当在 sList 中添加某些内容时重新执行此块时,它会覆盖当前通知,因为通知的 ID 相同。我怎样才能防止这种情况发生?我怎样才能每次都获得一个唯一的 ID?或者是否有可能避免整个 ID 部分,比如告诉 android 无论如何都必须显示通知,无论 ID 是什么?

提前致谢!

4

3 回答 3

22
long time = new Date().getTime();
String tmpStr = String.valueOf(time);
String last4Str = tmpStr.substring(tmpStr.length() - 5);
int notificationId = Integer.valueOf(last4Str);

notificationManager.notify(notificationId, notif);

它获取当前系统时间。然后我只读取它的最后 4 位数字。每次显示通知时,我都使用它来创建唯一 ID。因此,将避免获得相同或重置通知 id 的可能性。

于 2015-01-31T11:42:04.673 回答
12

我敢肯定,您不应该一次向用户发送这么多通知。您应该显示一个通知,该通知整合了有关一组事件的信息,例如 Gmail 客户端所做的。用于Notification.Builder此目的。

NotificationCompat.Builder b = new NotificationCompat.Builder(c);
       b.setNumber(g_push.Counter)
        .setLargeIcon(BitmapFactory.decodeResource(c.getResources(), R.drawable.list_avatar))
        .setSmallIcon(R.drawable.ic_stat_example)
        .setAutoCancel(true)
        .setContentTitle(pushCount > 1 ? c.getString(R.string.stat_messages_title) + pushCount : title)
        .setContentText(pushCount > 1 ? push.ProfileID : mess)
        .setWhen(g_push.Timestamp)
        .setContentIntent(PendingIntent.getActivity(c, 0, it, PendingIntent.FLAG_UPDATE_CURRENT))
        .setDeleteIntent(PendingIntent.getBroadcast(c, 0, new Intent(ACTION_CLEAR_NOTIFICATION), PendingIntent.FLAG_CANCEL_CURRENT))
        .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
        .setSound(Uri.parse(prefs.getString(
                SharedPreferencesID.PREFERENCE_ID_PUSH_SOUND_URI,
                "android.resource://ru.mail.mailapp/raw/new_message_bells")));

如果您仍然需要大量状态栏通知,则应将计数器的最后一个值保存在某处并使用 for 循环,如下所示:

    int counter = loadLastCounterValue();
    for(String s : sList){
            Notification notification = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText(s).setSmallIcon(R.drawable.ic_launcher).setContentIntent(pendingIntent).build();
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(++counter, notification);
    }
    saveCounter(counter);

但正如我所说,我认为这是一个糟糕的解决方案,会导致您的应用程序的用户体验不佳。

于 2012-10-19T16:21:40.270 回答
9

您可以简单地在通知生成器中指定一个 id。
相同的 id = 通知的更新
不同的 id = 新的通知。

此外,两个不同的应用程序可以使用相同的通知 ID,它会毫无问题地生成 2 个不同的通知。系统会同时查看 id 和它来自的应用程序。

于 2012-10-19T16:22:36.353 回答