Cách hiển thị nhiều thông báo trong Android


102

Tôi chỉ nhận được một thông báo và nếu có một thông báo khác, nó sẽ thay thế thông báo trước đó và đây là mã của tôi

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
Theo Tài liệu chính thức, bạn không nên hiển thị nhiều thông báo từ một ứng dụng mà bạn phải xếp chồng lên nhau tất cả các thông báo .. Hãy xem: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar 26/02/15

Câu trả lời:


134

chỉ cần thay thế dòng của bạn bằng cái này

 notificationManager.notify(Unique_Integer_Number, notification);

hy vọng nó sẽ giúp bạn.


2
những gì là Unique_Integer_Numbertrong mã của bạn .. và đó mã nó nên thay thế
Kartheek s

4
Số nguyên duy nhất có nghĩa là bạn phải đặt giá trị số nguyên sẽ không bao giờ lặp lại. ví dụ 0,1,2,3,4,5, .... !!!!
Sanket Shah

2
notificationManager.notify (1, thông báo); notificationManager.notify (2, thông báo);
Sanket Shah

1
Làm thế nào sẽ tự động tăng lên khi có thông báo ??
Mitesh Shah

21
tạo số nguyên duy nhất: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk

87

Thông báo_id đơn giản cần phải được thay đổi.

Chỉ cần tạo số ngẫu nhiên cho notification_id.

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

hoặc bạn có thể sử dụng phương pháp này để tạo số ngẫu nhiên theo yêu cầu của tieorange (điều này sẽ không bao giờ lặp lại):

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

và thay thế dòng này để thêm tham số cho id thông báo để tạo số ngẫu nhiên

    notificationManager.notify(m, notification);

8
Một chút khó khăn và có khả năng bạn sẽ kết thúc với cùng một id thông báo, nhưng điều này hoạt động nếu bạn cần một cái gì đó thực sự nhanh chóng.
Muhammad Abdul-Rahim

1
Nếu tôi thấy điều này đúng, apporach từ tieorange chỉ hoạt động với giây. Vì vậy, nếu bạn có nhiều thông báo cùng một lúc, điều này sẽ không hoạt động.
kiểm tra

1
@testing là đúng. đó là lý do tại sao tôi có bước thứ 2, m + = random.nextInt (100) + 1; điều này có thể là một bước bổ sung nhưng theo cách của nó an toàn hơn. Tôi thấy phương pháp trên không thành công trong những phút cuối cùng của ứng dụng Đấu giá / Đặt giá thầu. Do đó tôi đã thêm một dòng khác để an toàn!
user3833732

27

Sử dụng Tùy chọn Chia sẻ phù hợp với tôi

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
Đây là một cách thực hiện khá thông minh nếu bạn cũng cần theo dõi mọi thông báo được gửi. Có lẽ là một trong những câu trả lời thông minh hơn ở đây.
Muhammad Abdul-Rahim

12

Thay thế dòng của bạn bằng cái này.

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

Phương pháp này có khó xóa thông báo về một loại trọng tải cụ thể không?
Sethuraman Srinivasan

8

tôi đoán điều này sẽ giúp ai đó ..
trong mã bên dưới "not_nu" là một int ngẫu nhiên .. PendingIntent và Notification có cùng một ID .. để mỗi lần nhấp vào thông báo, ý định sẽ hướng đến hoạt động khác nhau ..

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

Các thông báo của tôi vẫn chưa xếp chồng lên nhau, có điều gì cụ thể mà tôi phải làm ngoài những gì bạn hiển thị ở đây không?
Lion789

Tính toán random.nextInt đó là gì ... bạn có thể giải thích không ??? 9999-1000 ???? đó là những gì ...
Radu

@Radu như bạn có thể thấy trong mã "notificationManager.notify (" lấy int (ID cho thông báo) làm tham số đầu tiên. Nếu Int (ID) này giống với thông báo mới, nó sẽ thay thế thông báo cũ và hiển thị thông báo mới. nếu Int (ID) này khác thì thông báo mới sẽ được xử lý riêng biệt và hiển thị dưới dạng ngăn xếp. Vì vậy, thông báo cũ hơn vẫn giữ nguyên. và để đạt được điều này, chúng tôi đang tạo int ngẫu nhiên và gán làm ID. "random.nextInt (9999 - 1000) + 1000; "bằng cách sử dụng mã này.
Muneef M

@ Lion789 bạn chỉ cần sử dụng ID khác cho các thông báo mới thì nó sẽ xếp chồng lên nhau các thông báo.
Muneef M

mới NotificationCompat.Builder (cái này); không được dùng trong Android Oreo, Vui lòng kiểm tra tài liệu và sử dụng triển khai Kênh thông báo.
TapanHP

5

Tại vị trí uniqueIntNođặt số nguyên duy nhất như thế này:

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


3

Tôi đã giải quyết vấn đề của mình như thế này ...

/**
     * 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

Một cách khác để làm điều đó là lấy ngày hiện tại chuyển nó thành dài chỉ cần lấy 4 chữ số cuối cùng. Khả năng cao là số đó sẽ là duy nhất.

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

Tại sao chỉ sử dụng bốn chữ số cuối cùng mà không sử dụng chính ngày giờ?
Muhammad Abdul-Rahim

4
Đây là mã ngắn hơn một chút:int notificationId = System.currentTimeMillis()%10000;
bvk256

tại sao chỉ có 4 chữ số?
Pavel Biryukov

2

Bạn chỉ cần thay đổi một dòng của mình từ notificationManager.notify(0, notification);thành notificationManager.notify((int) System.currentTimeMillis(), notification);...

Điều này sẽ thay đổi id của thông báo bất cứ khi nào thông báo mới xuất hiện


1
notificationManager.notify(0, notification);

Đặt mã này thay vì 0

new Random().nextInt() 

Giống như dưới đây nó hoạt động cho tôi

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

1
Từ đánh giá: Xin chào, vui lòng không trả lời chỉ bằng mã nguồn. Cố gắng cung cấp một mô tả đẹp về cách giải pháp của bạn hoạt động. Xem: Làm thế nào để viết một câu trả lời tốt? . Cảm ơn
sɐunıɔ ןɐ qɐp

0

Vấn đề là với của bạn notificationId. Hãy coi nó như một chỉ số mảng. Mỗi lần bạn cập nhật thông báo của mình, đó chính notificationIdlà nơi lưu trữ giá trị. Vì bạn không tăng giá trị int của mình (trong trường hợp này là của bạn notificationId), giá trị này luôn thay thế giá trị trước đó. Giải pháp tốt nhất mà tôi đoán là tăng nó lên ngay sau khi bạn cập nhật thông báo. Và nếu bạn muốn giữ nó dai dẳng, sau đó bạn có thể lưu trữ các giá trị của bạn notificationIdtrong sharedPreferences. Bất cứ khi nào bạn quay lại, bạn chỉ có thể lấy giá trị số nguyên cuối cùng ( notificationIdđược lưu trữ trong sharedPreferences) và sử dụng nó.


0

Dưới đây là mã để vượt qua id thông báo duy nhất:

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

Đặt lại notificationIdsavedPreferencesphạm vi cụ thể như tôi đã làm ở 1000. Vì vậy, nó sẽ không tạo ra bất kỳ vấn đề nào trong tương lai. Hãy cho tôi biết nếu bạn cần thêm thông tin chi tiết hoặc bất kỳ câu hỏi nào. :)


Xin chào, bạn có thể đăng mã đầy đủ được không, chúng tôi biết để tạo nhiều thông báo cần id duy nhất nhưng sau khi tạo, chúng tôi cũng phải hủy thông báo cụ thể đó .. có vấn đề để lưu và lấy từng id duy nhất trong trường hợp của tôi nếu bạn có thể giúp đỡ
Jayman Jani

0

Sử dụng phương pháp sau trong mã của bạn.

Phương thức gọi: -

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

Phương pháp:-

  *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

Một bộ đếm đơn giản có thể giải quyết vấn đề của bạn.

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.