次のような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);
}
このブロックは、alarmmanagerによってトリガーされるサービスにあります。したがって、このブロックは、ユーザーに通知が表示される前に数回実行される可能性があります。通知のIDが同じであるため、sListに何かが追加されたときにこのブロックが再実行されると、現在の通知が上書きされます。どうすればそれを防ぐことができますか?毎回一意のIDを取得するにはどうすればよいですか?またはAndroidとにかく通知を表示する必要があります)にIDが何であるかを伝えるなど、ID部分全体を回避することは可能ですか?
前もって感謝します!
一度に多くのユーザーへの通知を受け取るべきではないと確信しています。たとえば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);
しかし、私が言ったように、それはあなたのアプリからの悪いユーザーエクスペリエンスにつながる悪い解決策だと思います。
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が同じになるか、リセットされる可能性は回避されます。
通知ビルダーでIDを指定するだけです。
同じID =通知の更新
異なるID =新しい通知。
また、2つの異なるアプリが同じ通知IDを使用でき、問題なく2つの異なる通知を生成します。システムは、IDとそれが由来するアプリの両方を調べます。