web-dev-qa-db-ja.com

Android:通知の一意のIDを取得します

次のような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部分全体を回避することは可能ですか?

前もって感謝します!

15
Xander

一度に多くのユーザーへの通知を受け取るべきではないと確信しています。たとえば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);

しかし、私が言ったように、それはあなたのアプリからの悪いユーザーエクスペリエンスにつながる悪い解決策だと思います。

12
rus1f1kat0R
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が同じになるか、リセットされる可能性は回避されます。

22
satyapol

通知ビルダーでIDを指定するだけです。
同じID =通知の更新
異なるID =新しい通知。

また、2つの異なるアプリが同じ通知IDを使用でき、問題なく2つの異なる通知を生成します。システムは、IDとそれが由来するアプリの両方を調べます。

7
Teovald