Androidで複数の通知を表示する方法


103

通知を1つだけ受け取っています。別の通知があった場合、それは前の通知を置き換えます。これが私のコードです

private static void generateNotification(Context context, String message,
        String key) {
    int icon = R.drawable.ic_launcher;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, message, when);

    String title = context.getString(R.string.app_name);

    Intent notificationIntent = new Intent(context,
            FragmentOpenActivity.class);
    notificationIntent.putExtra(key, key);
    // set intent so it does not start a new activity
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent = PendingIntent.getActivity(context, 0,
            notificationIntent, 0);
    notification.setLatestEventInfo(context, title, message, intent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notification.defaults |= Notification.DEFAULT_SOUND;

    // notification.sound = Uri.parse("android.resource://" +
    // context.getPackageName() + "your_sound_file_name.mp3");
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notificationManager.notify(0, notification);

}

3
公式ドキュメントごととして、あなたは見てください..あなたはすべての通知をスタックする必要が1つのアプリから複数の通知を表示しないでください。 developer.android.com/design/patterns/notifications_k.html
Gowthamクマール

回答:


134

これであなたのラインを交換してください

 notificationManager.notify(Unique_Integer_Number, notification);

それがお役に立てば幸いです。


2
Unique_Integer_Numberあなたのコードには何が..そして、それが置き換えるコード
Kartheek s

4
一意の整数値は、繰り返されない整数値を設定する必要があることを意味します。例0,1,2,3,4,5、.... !!!!
Sanket Shah 2013

2
notificationManager.notify(1、notification); notificationManager.notify(2、notification);
Sanket Shah 2013

1
通知が来ると、どのように自動的にインクリメントされますか?
Mitesh Shah 2014

21
一意の整数を生成:(int)((new Date()。getTime()/ 1000L)%Integer.MAX_VALUE);
Andrii Kovalchuk 2016

87

単純なnotification_idは変更可能である必要があります。

notification_idに乱数を作成するだけです。

    Random random = new Random();
    int m = random.nextInt(9999 - 1000) + 1000;

または、このメソッドを使用して、tieorangeから通知された乱数を作成できます(これは繰り返されません):

    int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);

この行を置き換えて、乱数を生成するための通知IDのパラメーターを追加します

    notificationManager.notify(m, notification);

8
少しハッキーで、同じ通知IDで終わる可能性がありますが、これは非常に迅速な処理が必要な場合に機能します。
ムハンマドアブドゥルラヒム2015年

1
私がこれを正しく見ると、tieorangeからのアプローチは秒でしか機能しません。したがって、同じ秒に複数の通知がある場合、これは機能しません。
テスト

1
@testingは正しいです。これが、2番目のステップがある理由です。m+ = random.nextInt(100)+ 1; これは一歩余分かもしれませんが、その方法はより安全です。上記の方法がオークション/入札アプリの最後の数分で失敗するのを見ました。したがって、安全のために別の行を追加しました!
user3833732 2018年

27

共有設定の使用は私のために働きました

SharedPreferences prefs = getSharedPreferences(Activity.class.getSimpleName(), Context.MODE_PRIVATE);
int notificationNumber = prefs.getInt("notificationNumber", 0);
...

notificationManager.notify(notificationNumber , notification);
SharedPreferences.Editor editor = prefs.edit();
notificationNumber++;
editor.putInt("notificationNumber", notificationNumber);
editor.commit();

5
これは、送信されたすべての通知も追跡する必要がある場合に、かなりスマートな方法です。おそらくここで賢い答えの1つです。
ムハンマドアブドゥルラヒム2015年

12

これであなたの行を置き換えます。

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);

このアプローチでは、特定のペイロードタイプの通知を削除することが難しくなりますか?
Sethuraman Srinivasan

8

私はこれが誰かを助けると思います..
以下のコードでは、「not_nu」はランダムな整数です。

private void sendNotification(String message,String title,JSONObject extras) throws JSONException {
   String id = extras.getString("actionParam");
    Log.e("gcm","id  = "+id);
    Intent intent = new Intent(this, OrderDetailActivty.class);
    intent.putExtra("id", id);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    final int not_nu=generateRandom();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, not_nu /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_cart_red)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(not_nu /* ID of notification */, notificationBuilder.build());
}
public int generateRandom(){
    Random random = new Random();
    return random.nextInt(9999 - 1000) + 1000;
}

通知がまだ積み重なっていないのですが、ここに表示する内容以外に、何かしなければならないことはありますか?
Lion789

そこでrandom.nextIntの計算は何をしていますか...説明できますか??? 9999-1000 ???? それは...
Radu 2017年

コードで確認できる@Radu「notificationManager.notify(」は、最初のパラメーターとしてint(通知のID)を取ります。このInt(ID)が新しい通知と同じ場合、古い通知を置き換え、新しい通知を表示します。このInt(ID)が異なる場合、新しい通知は個別に処理され、スタックとして表示されます。これにより、古い通知が残ります。これを実現するために、ランダムなintを作成し、IDとして割り当てます。 "random.nextInt(9999-1000) + 1000; "このコードを使用して
Muneef M

@ Lion789は、新しい通知に別のIDを使用する必要があるだけで、通知がスタックされます。
Muneef M 2017

新しいNotificationCompat.Builder(this); はAndroid Oreoでは非推奨です。ドキュメントを確認し、通知チャネルの実装を使用してください。
TapanHP

5

uniqueIntNo次のように一意の整数を置く場所:

mNotificationManager.notify(uniqueIntNo, builder.build());


3

私はこのように私の問題を解決しました...

/**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message,
            String keys, String msgId, String branchId) {
        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationCompat.Builder nBuilder;
        Uri alarmSound = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        nBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Smart Share - " + keys)
                .setLights(Color.BLUE, 500, 500).setContentText(message)
                .setAutoCancel(true).setTicker("Notification from smartshare")
                .setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })
                .setSound(alarmSound);
        String consumerid = null;
        Integer position = null;
        Intent resultIntent = null;
        if (consumerid != null) {
            if (msgId != null && !msgId.equalsIgnoreCase("")) {
                if (key != null && key.equalsIgnoreCase("Yo! Matter")) {
                    ViewYoDataBase db_yo = new ViewYoDataBase(context);
                    position = db_yo.getPosition(msgId);
                    if (position != null) {
                        resultIntent = new Intent(context,
                                YoDetailActivity.class);
                        resultIntent.putExtra("id", Integer.parseInt(msgId));
                        resultIntent.putExtra("position", position);
                        resultIntent.putExtra("notRefresh", "notRefresh");
                    } else {
                        resultIntent = new Intent(context,
                                FragmentChangeActivity.class);
                        resultIntent.putExtra(key, key);
                    }
                } else if (key != null && key.equalsIgnoreCase("Message")) {
                    resultIntent = new Intent(context,
                            FragmentChangeActivity.class);
                    resultIntent.putExtra(key, key);
                }.
.
.
.
.
.
            } else {
                resultIntent = new Intent(context, FragmentChangeActivity.class);
                resultIntent.putExtra(key, key);
            }
        } else {
            resultIntent = new Intent(context, MainLoginSignUpActivity.class);
        }
        PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
                notify_no, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        if (notify_no < 9) {
            notify_no = notify_no + 1;
        } else {
            notify_no = 0;
        }
        nBuilder.setContentIntent(resultPendingIntent);
        NotificationManager nNotifyMgr = (NotificationManager) context
                .getSystemService(context.NOTIFICATION_SERVICE);
        nNotifyMgr.notify(notify_no + 2, nBuilder.build());
    }

3

これを行う別の方法は、現在の日付を取得して、最後の4桁だけをlongに変換することです。番号が一意になる可能性が高いです。

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

日時自体ではなく、最後の4桁だけを使用するのはなぜですか?
ムハンマドアブドゥルラヒム

4
これは少し短いコードです:int notificationId = System.currentTimeMillis()%10000;
bvk256

なぜ4桁しかないのですか?
Pavel Biryukov

2

1行をnotificationManager.notify(0, notification);から notificationManager.notify((int) System.currentTimeMillis(), notification);... に変更するだけです。

これにより、新しい通知が表示されるたびに通知のIDが変更されます


1
notificationManager.notify(0, notification);

0の代わりにこのコードを入れてください

new Random().nextInt() 

以下のように私のために働きます

notificationManager.notify(new Random().nextInt(), notification);

1
口コミから:こんにちは。ソースコードだけで答えないでください。ソリューションがどのように機能するかについて、わかりやすい説明を提供してください。参照:良い回答を書くにはどうすればよいですか?。おかげで
sɐunıɔןɐqɐp

0

問題はあなたにありますnotificationId。配列のインデックスと考えてください。通知を更新するたびに、notificationIdは値を保存する場所です。int値(この場合はnotificationId)を増分していないため、これは常に以前の値を置き換えます。私が推測する最善の解決策は、通知を更新した直後にインクリメントすることです。あなたが永続的な、それを維持したいなら、あなたはあなたの価値保存することができますnotificationIdではsharedPreferences。戻ってきたときはいつでも、最後の整数値(にnotificationId格納されているsharedPreferences)を取得して使用できます。


0

以下は、固有の通知IDを渡すためのコードです。

//"CommonUtilities.getValudeFromOreference" is the method created by me to get value from savedPreferences.
String notificationId = CommonUtilities.getValueFromPreference(context, Global.NOTIFICATION_ID, "0");
int notificationIdinInt = Integer.parseInt(notificationId);

notificationManager.notify(notificationIdinInt, notification);

// will increment notification id for uniqueness
notificationIdinInt = notificationIdinInt + 1;
CommonUtilities.saveValueToPreference(context, Global.NOTIFICATION_ID, notificationIdinInt + "");
//Above "CommonUtilities.saveValueToPreference" is the method created by me to save new value in savePreferences.

私が1000で行ったように、特定の範囲でリセットnotificationIdsavedPreferencesます。したがって、今後問題が発生することはありません。より詳細な情報やクエリが必要な場合はお知らせください。:)


こんにちは完全なコードを投稿できます。複数の通知を生成するために一意のIDが必要ですが、生成後にその特定の通知もキャンセルする必要があります
。plsを

0

コードで次のメソッドを使用します。

メソッド呼び出し:-

notificationManager.notify(getCurrentNotificationId(getApplicationContext()), notification);

方法:-

  *Returns a unique notification id.
         */

        public static int getCurrentNotificationId(Context iContext){

            NOTIFICATION_ID_UPPER_LIMIT = 30000; // Arbitrary number.

            NOTIFICATION_ID_LOWER_LIMIT = 0;
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(iContext);
        int previousTokenId= sharedPreferences.getInt("currentNotificationTokenId", 0);

        int currentTokenId= previousTokenId+1;

        SharedPreferences.Editor editor= sharedPreferences.edit();

        if(currentTokenId<NOTIFICATION_ID_UPPER_LIMIT) {

            editor.putInt("currentNotificationTokenId", currentTokenId); // }
        }else{
            //If reaches the limit reset to lower limit..
            editor.putInt("currentNotificationTokenId", NOTIFICATION_ID_LOWER_LIMIT);
        }

        editor.commit();

        return currentTokenId;
    }

-1

単純なカウンターで問題を解決できる場合があります。

private Integer notificationId = 0;

private Integer incrementNotificationId() {
   return notificationId++;
}

NotificationManager.notify(incrementNotificationId, notification);

-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());

-1
val notifyIdLong = ((Date().time / 1000L) % Integer.MAX_VALUE)
var notifyIdInteger = notifyIdLong.toInt()
if (notifyIdInteger < 0) notifyIdInteger = -1  * notifyIdInteger // if it's -ve change to positive
notificationManager.notify(notifyIdInteger, mBuilder.build())
log.d(TAG,"notifyId = $notifyIdInteger")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.