Cara menampilkan banyak notifikasi di android

103

Saya hanya menerima satu pemberitahuan dan jika ada pemberitahuan lain, itu menggantikan yang sebelumnya dan ini kode saya

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

}
Kartheek s
sumber
3
Sesuai Dokumen resmi, Anda tidak boleh menampilkan banyak pemberitahuan dari satu aplikasi, Anda harus menumpuk semua pemberitahuan .. Lihat: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

Jawaban:

134

ganti saja baris Anda dengan ini

 notificationManager.notify(Unique_Integer_Number, notification);

berharap ini akan membantu Anda.

Sanket Shah
sumber
2
apa yang ada Unique_Integer_Numberdi kode Anda .. dan kode mana yang harus diganti
Kartheek s
4
Angka integer unik artinya Anda harus mengatur nilai integer yang tidak akan pernah terulang. contoh 0,1,2,3,4,5, .... !!!!
Sanket Shah
2
notificationManager.notify (1, notification); notificationManager.notify (2, notification);
Sanket Shah
1
Bagaimana kenaikan secara otomatis saat pemberitahuan datang ??
Mitesh Shah
21
menghasilkan integer unik: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk
87

Notification_id sederhana harus dapat diubah.

Buat saja nomor acak untuk notification_id.

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

atau Anda dapat menggunakan metode ini untuk membuat nomor acak seperti yang diceritakan oleh tieorange (ini tidak akan pernah terulang):

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

dan ganti baris ini untuk menambahkan parameter id notifikasi untuk menghasilkan nomor acak

    notificationManager.notify(m, notification);
sagar.android
sumber
8
Agak hacky dan memiliki kemungkinan bahwa Anda akan mendapatkan id notifikasi yang sama, tetapi ini berfungsi jika Anda membutuhkan sesuatu yang sangat cepat.
Muhammad Abdul-Rahim
1
Jika saya melihat ini dengan benar, apporach dari tieorange hanya bekerja dengan detik. Jadi, jika Anda memiliki beberapa notifikasi pada saat yang sama, ini tidak akan berfungsi.
menguji
1
@ Pengujian benar. itulah mengapa saya memiliki langkah ke-2, m + = random.nextInt (100) + 1; ini mungkin satu langkah ekstra tetapi cara ini lebih aman. Saya melihat metode di atas gagal pada menit-menit terakhir aplikasi Lelang / Penawaran. Karenanya saya menambahkan baris lain untuk keamanan!
pengguna3833732
27

Menggunakan Preferensi Bersama berhasil untuk saya

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();
vLopez
sumber
5
Ini adalah cara yang cukup cerdas untuk melakukannya jika Anda juga perlu melacak setiap notifikasi yang dikirim. Mungkin salah satu jawaban cerdas di sini.
Muhammad Abdul-Rahim
12

Ganti baris Anda dengan ini.

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);
Tony Baby
sumber
Bukankah menghapus pemberitahuan jenis payload tertentu menjadi sulit dengan pendekatan ini?
Sethuraman Srinivasan
8

Saya rasa ini akan membantu seseorang ..
di bawah kode "not_nu" adalah int random .. PendingIntent dan Notification memiliki ID yang sama .. sehingga pada setiap klik notifikasi maksudnya akan mengarah ke aktivitas yang berbeda ..

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;
}
Muneef M
sumber
Notifikasi saya tidak menumpuk, apakah ada hal khusus yang harus saya lakukan selain yang Anda tampilkan di sini?
Lion789
Apa yang dilakukan perhitungan random.nextInt di sana ... dapatkah Anda menjelaskan ??? 9999-1000 ???? apa itu ...
Radu
@Radu seperti yang Anda lihat pada kode "notificationManager.notify (" mengambil int (ID untuk notifikasi) sebagai parameter pertama. Jika Int (ID) ini sama untuk notifikasi baru, itu akan menggantikan yang lama dan menampilkan yang baru. jika Int (ID) ini berbeda maka pemberitahuan baru diperlakukan secara terpisah dan ditampilkan sebagai tumpukan. sehingga pemberitahuan yang lebih lama tetap ada. dan untuk mencapai ini. kami membuat int acak dan menetapkannya sebagai ID. "random.nextInt (9999 - 1000) + 1000; "menggunakan kode ini.
Muneef M
@ Lion789 Anda hanya perlu menggunakan ID yang berbeda untuk pemberitahuan baru maka itu harus menumpuk pemberitahuan.
Muneef M
NotificationCompat.Builder baru (ini); tidak digunakan lagi di Android Oreo, Harap periksa dokumen dan gunakan implementasi Saluran Pemberitahuan.
TapanHP
5

Di tempat uniqueIntNomeletakkan bilangan bulat unik seperti ini:

mNotificationManager.notify(uniqueIntNo, builder.build());
Sachin Singh
sumber
3

Saya memecahkan masalah saya seperti ini ...

/**
     * 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());
    }
Kartheek s
sumber
3

Cara lain untuk melakukannya adalah mengambil tanggal saat ini, mengubahnya menjadi panjang, ambil saja 4 digit terakhir. Ada kemungkinan besar bahwa nomor tersebut unik.

    long time = new Date().getTime();
    String tmpStr = String.valueOf(time);
    String last4Str = tmpStr.substring(tmpStr.length() -5);
    int notificationId = Integer.valueOf(last4Str);
Vidyadhara
sumber
Mengapa hanya menggunakan empat digit terakhir dan bukan tanggal waktu itu sendiri?
Muhammad Abdul-Rahim
4
Berikut adalah kode yang sedikit lebih pendek:int notificationId = System.currentTimeMillis()%10000;
bvk256
kenapa hanya 4 digit?
Pavel Biryukov
2

Anda hanya perlu mengubah satu baris Anda dari notificationManager.notify(0, notification);menjadi notificationManager.notify((int) System.currentTimeMillis(), notification);...

Ini akan mengubah id pemberitahuan setiap kali pemberitahuan baru akan muncul

Arun Sriramula
sumber
1
notificationManager.notify(0, notification);

Letakkan kode ini, bukan 0

new Random().nextInt() 

Seperti di bawah ini, ini bekerja untuk saya

notificationManager.notify(new Random().nextInt(), notification);
Sameer Ahmed Mallah
sumber
1
Dari Ulasan: Hai, tolong jangan jawab hanya dengan kode sumber. Cobalah untuk memberikan gambaran yang bagus tentang bagaimana solusi Anda bekerja. Lihat: Bagaimana cara menulis jawaban yang baik? . Terima kasih
sɐunıɔ ןɐ qɐp
0

Masalahnya ada pada Anda notificationId. Anggap saja sebagai indeks array. Setiap kali Anda memperbarui notifikasi, di notificationIdsinilah tempat yang diperlukan untuk menyimpan nilai. Karena Anda tidak menaikkan nilai int Anda (dalam hal ini, Anda notificationId), ini selalu menggantikan yang sebelumnya. Solusi terbaik yang saya kira adalah menaikkannya tepat setelah Anda memperbarui pemberitahuan. Dan jika Anda ingin tetap gigih, maka Anda dapat menyimpan nilai Anda notificationIddi sharedPreferences. Setiap kali Anda kembali, Anda bisa mengambil nilai integer terakhir ( notificationIddisimpan dalam sharedPreferences) dan menggunakannya.

androCoder-BD
sumber
0

Di bawah ini adalah kode untuk melewati id pemberitahuan unik:

//"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.

Atur notificationIddi savedPreferencesjarak tertentu seperti saya telah melakukannya pada 1000. Jadi tidak akan membuat masalah apapun di masa depan. Beri tahu saya jika Anda memerlukan informasi lebih detail atau pertanyaan apa pun. :)

Gaurav Darji
sumber
halo dapatkah Anda memposting kode lengkap dengan baik, kami tahu untuk menghasilkan banyak pemberitahuan membutuhkan id unik tetapi setelah menghasilkan kami juga harus membatalkan pemberitahuan tersebut .. ada masalah untuk menyimpan dan mendapatkan setiap id unik dalam kasus saya jika Anda dapat membantu tolong
Jayman Jani
0

Gunakan metode berikut dalam kode Anda.

Metode panggilan: -

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

Metode:-

  *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;
    }
Sreekanth Karumanaghat
sumber
-1

Penghitung sederhana dapat menyelesaikan masalah Anda.

private Integer notificationId = 0;

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

NotificationManager.notify(incrementNotificationId, notification);
nirfrea.dll
sumber
-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());
amar
sumber
-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")
EdgeDev
sumber