วิธีแสดงการแจ้งเตือนหลายรายการใน Android


104

ฉันได้รับการแจ้งเตือนเพียงครั้งเดียวและหากมีการแจ้งเตือนอีกรายการจะแทนที่การแจ้งเตือนก่อนหน้าและนี่คือรหัสของฉัน

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
ตามเอกสารอย่างเป็นทางการคุณไม่ควรแสดงการแจ้งเตือนหลายรายการจากแอปเดียวคุณต้องซ้อนการแจ้งเตือนทั้งหมด .. ดูได้ที่: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

คำตอบ:


135

เพียงแค่แทนที่บรรทัดของคุณด้วยสิ่งนี้

 notificationManager.notify(Unique_Integer_Number, notification);

หวังว่ามันจะช่วยคุณได้


2
Unique_Integer_Numberรหัสของคุณคืออะไร.. และควรแทนที่รหัสใด
Kartheek

4
จำนวนเต็มที่ไม่ซ้ำหมายความว่าคุณต้องตั้งค่าจำนวนเต็มที่จะไม่เกิดซ้ำ ตัวอย่าง 0,1,2,3,4,5, .... !!!!
Sanket Shah

2
NotificationManager.notify (1, การแจ้งเตือน); NotificationManager.notify (2, การแจ้งเตือน);
Sanket Shah

1
จะเพิ่มขึ้นโดยอัตโนมัติเมื่อมีการแจ้งเตือนมาได้อย่างไร?
Mitesh Shah

21
สร้างจำนวนเต็มเฉพาะ: (int) ((วันที่ใหม่ (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk

89

Notification_id แบบง่ายต้องสามารถเปลี่ยนได้

เพียงสร้างหมายเลขสุ่มสำหรับ notification_id

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

หรือคุณสามารถใช้วิธีนี้ในการสร้างหมายเลขสุ่มตามที่ไทโอเรนบอก (สิ่งนี้จะไม่เกิดขึ้นซ้ำ):

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

และแทนที่บรรทัดนี้เพื่อเพิ่มพารามิเตอร์สำหรับ id การแจ้งเตือนเพื่อสร้างหมายเลขสุ่ม

    notificationManager.notify(m, notification);

9
แฮ็คเล็กน้อยและพบความเป็นไปได้ที่คุณจะลงเอยด้วยรหัสการแจ้งเตือนเดียวกัน แต่ใช้งานได้หากคุณต้องการบางอย่างที่รวดเร็ว
มูฮัมหมัดอับดุลราฮิม

2
ถ้าฉันเห็นสิ่งนี้ถูกต้อง apporach จาก tieorange ใช้งานได้ในไม่กี่วินาทีเท่านั้น ดังนั้นหากคุณมีการแจ้งเตือนหลายรายการในวินาทีเดียวกันสิ่งนี้จะไม่ทำงาน
ทดสอบ

1
@ การทดสอบถูกต้อง นั่นคือเหตุผลที่ฉันมีขั้นตอนที่ 2 m + = random.nextInt (100) + 1; นี่อาจเป็นขั้นตอนพิเศษ แต่วิธีนี้ปลอดภัยกว่า ฉันเห็นว่าวิธีการข้างต้นล้มเหลวในช่วงนาทีสุดท้ายของแอปการประมูล / การเสนอราคา ดังนั้นฉันจึงเพิ่มอีกบรรทัดเพื่อความปลอดภัย!
user3833732

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
นี่เป็นวิธีที่ค่อนข้างฉลาดหากคุณต้องการติดตามทุกการแจ้งเตือนที่ส่งไปด้วย อาจเป็นหนึ่งในคำตอบที่ชาญฉลาดกว่าที่นี่
มูฮัมหมัดอับดุลราฮิม

12

แทนที่บรรทัดของคุณด้วยสิ่งนี้

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

การลบการแจ้งเตือนประเภทเพย์โหลดบางประเภทไม่ได้เป็นเรื่องยากสำหรับวิธีนี้หรือไม่?
Sethuraman Srinivasan

8

ฉันเดาว่านี่จะช่วยใครบางคน ..
ในโค้ดด้านล่าง "not_nu" เป็น int แบบสุ่ม .. PendingIntent และ Notification มี ID เดียวกัน .. ดังนั้นในการแจ้งเตือนแต่ละครั้งการคลิก Intent จะนำไปสู่กิจกรรมที่แตกต่างกัน ..

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

@Radu ตามที่คุณเห็นในโค้ด "notificationManager.notify (" ใช้ int (ID สำหรับการแจ้งเตือน) เป็นพารามิเตอร์แรกหาก Int (ID) นี้เหมือนกันสำหรับการแจ้งเตือนใหม่จะแทนที่อันเก่าและแสดงใหม่ หาก Int (ID) นี้แตกต่างกันการแจ้งเตือนใหม่จะได้รับการปฏิบัติแยกกันและแสดงเป็นสแต็กดังนั้นการแจ้งเตือนแบบเก่าจึงยังคงอยู่และเพื่อให้บรรลุสิ่งนี้เรากำลังสร้าง int แบบสุ่มและกำหนดเป็น ID "random.nextInt (9999 - 1000) + 1000; "โดยใช้รหัสนี้
Muneef M

@ Lion789 คุณต้องใช้ ID ที่แตกต่างกันสำหรับการแจ้งเตือนใหม่ดังนั้นควรซ้อนการแจ้งเตือน
Muneef M

ใหม่ NotificationCompat.Builder (นี้); เลิกใช้งานแล้วใน Android Oreo โปรดตรวจสอบเอกสารและใช้การติดตั้งช่องการแจ้งเตือน
TapanHP



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

อีกวิธีในการทำคือใช้วันที่ปัจจุบันแปลงเป็น long โดยใช้ตัวเลข 4 หลักสุดท้าย มีความเป็นไปได้สูงที่หมายเลขจะไม่ซ้ำกัน

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

เหตุใดจึงใช้เพียงสี่หลักสุดท้ายไม่ใช่วันที่และเวลา
มูฮัมหมัดอับดุลราฮิม

4
รหัสที่สั้นกว่านี้เล็กน้อย:int notificationId = System.currentTimeMillis()%10000;
bvk256

ทำไมแค่ 4 หลัก?
Pavel Biryukov

2

คุณเพียงแค่ต้องเปลี่ยนหนึ่งบรรทัดของคุณจากnotificationManager.notify(0, notification);เป็น notificationManager.notify((int) System.currentTimeMillis(), notification);...

การดำเนินการนี้จะเปลี่ยนรหัสการแจ้งเตือนทุกครั้งที่มีการแจ้งเตือนใหม่ปรากฏขึ้น


2
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

ด้านล่างนี้คือรหัสสำหรับ pass 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.

รีเซ็ตnotificationIdในsavedPreferencesช่วงเฉพาะอย่างที่เคยทำที่ 1,000 ดังนั้นจะไม่สร้างปัญหาใด ๆ ในอนาคต โปรดแจ้งให้เราทราบหากคุณต้องการข้อมูลรายละเอียดเพิ่มเติมหรือข้อสงสัยใด ๆ :)


สวัสดีคุณสามารถโพสต์รหัสแบบเต็มได้หรือไม่ที่เรารู้เพื่อสร้างการแจ้งเตือนหลายรายการจำเป็นต้องใช้รหัสเฉพาะ แต่หลังจากสร้างแล้วเราต้องยกเลิกการแจ้งเตือนนั้นด้วย .. มีปัญหาในการบันทึกและรับรหัสที่ไม่ซ้ำกันในกรณีของฉันหากคุณสามารถช่วยได้
Jayman Jani

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