Подтвердить что ты не робот

Android: получите уникальный идентификатор уведомления

У меня есть блок 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, оно отменяет текущие уведомления, потому что идентификатор уведомления одинаковый. Как я могу предотвратить это? Как я могу получить уникальный идентификатор каждый раз? Или может быть возможно избежать всей части идентификатора, например, сообщать андроиду, который должен показать уведомление в любом случае, независимо от того, какой идентификатор?

Спасибо заранее!

4b9b3361

Ответ 1

Я уверен, что у вас не должно быть так много уведомлений для пользователя сразу. Вы должны показать одно уведомление, которое объединяет информацию о группе событий, например, как клиент 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")));

Если вам все еще нужно иметь много уведомлений о статусной строке, вы должны где-то сохранить последнее значение своего счетчика и использовать для цикла следующим образом:

    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);

Но, как я уже сказал, я думаю, что это плохое решение, которое приводит к плохой работе с вашим приложением.

Ответ 2

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 цифры. Я использую его для создания уникального идентификатора каждый раз, когда отображается уведомление. Таким образом, вероятность получения одинакового или reset идентификатора уведомления будет устранена.

Ответ 3

вы можете просто указать идентификатор в построителе уведомлений.
Тот же идентификатор = обновление уведомления
другое id = новое уведомление.

Кроме того, два разных приложения могут использовать один и тот же идентификатор уведомления, он будет выдавать 2 разных уведомления без проблем. система смотрит как на id, так и на приложение, откуда оно исходит.