如何在Android中显示多个通知


103

我只收到一个通知,如果有另一个通知,它将代替前一个,这是我的代码

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库马尔

Answers:


134

只需用此替换您的行

 notificationManager.notify(Unique_Integer_Number, notification);

希望对您有帮助。


2
Unique_Integer_Number您的代码中有什么..以及应替换哪些代码
Kartheek的

4
唯一整数表示您必须设置永远不会重复的整数值。例如0,1,2,3,4,5,.... !!!
Sanket Shah 2013年

2
notificationManager.notify(1,通知); notificationManager.notify(2,通知);
Sanket Shah 2013年

1
通知到来后如何自动增加?
Mitesh Shah 2014年

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

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,但这在您需要非常快速的操作时可以使用。
穆罕默德·阿卜杜勒·拉希姆

1
如果我没看错,tieorange的方法只能用几秒钟。因此,如果您同时有多个通知,则此操作将无效。
测试

1
@测试是正确的。那就是为什么我有第二步,m + = random.nextInt(100)+1; 这可能会多出一个步骤,但更安全。我在拍卖/竞标应用的最后几分钟看到上述方法失败。因此,我增加了另一条安全性!
user3833732 '18

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”中是一个随机整数。.PendingIntent和Notification具有相同的ID ..因此,在每个通知上单击,意图都将指向不同的活动。

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 '16

那那的random.nextInt计算是什么...你能解释一下吗?9999-1000 ???? 那是什么...
Radu

正如您在代码“ notificationManager.notify(”中看到的那样)@Radu将int(通知ID)作为第一个参数。如果此Int(ID)与新通知相同,它将替换旧的并显示新的通知。如果此Int(ID)不同,则新通知将被单独处理并显示为堆栈。因此,较旧的通知将保留。要实现此目的,我们正在创建随机int并将其分配为ID。“ random.nextInt(9999-1000) + 1000;”使用此代码。
Muneef中号

@ Lion789,您只需要对新通知使用不同的ID,则它应将通知堆叠起来。
Muneef M 2017年

新的NotificationCompat.Builder(this); 在Android Oreo中已弃用,请检查文档并使用Notification Channel实施。
TapanHP '18



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

每当新的通知出现时,这将更改通知的ID



0

问题出在你的notificationId。将其视为数组索引。每次更新通知时,notificationId都是存储值的地方。由于您没有增加int值(在本例中为your notificationId),因此它将始终替换前一个值。我猜最好的解决方案是在更新通知后立即增加它。而且,如果您想保持其持久性,则可以将notificationIdin 的值存储在中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.

重置notificationIdsavedPreferences特定范围内像我已经做到了在1000所以不会在未来产生任何问题。让我知道您是否需要更多详细信息或任何查询。:)


您好,您能发布完整的代码吗,我们知道要生成多个通知需要唯一的ID,但是在生成之后,我们还必须取消该特定的通知..如果您能帮助我,那么在保存和获取每个唯一ID方面存在问题
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
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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.