生成int唯一标识为android通知ID

当我发送多个推送通知时,我需要它们全部显示在通过发送desc命令sorting的通知栏中。 我知道我应该使用唯一的通知 – 我试图产生随机数,但这并没有解决我的问题,因为我需要他们订购。 我试图使用AtomicInt ,仍然没有预期的结果。

 package com.mypackage.lebadagency; import java.util.concurrent.atomic.AtomicInteger; import android.app.IntentService; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.SystemClock; import android.support.v4.app.NotificationCompat; import android.util.Log; import android.widget.RemoteViews; import com.google.android.gms.gcm.GoogleCloudMessaging; public class GCMNotificationIntentService extends IntentService { private AtomicInteger c = new AtomicInteger(0); public int NOTIFICATION_ID = c.incrementAndGet(); private NotificationManager mNotificationManager; NotificationCompat.Builder builder; public GCMNotificationIntentService() { super("GcmIntentService"); } public static final String TAG = "GCMNotificationIntentService"; @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR .equals(messageType)) { sendNotification("Send error: " + extras.toString()); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED .equals(messageType)) { sendNotification("Deleted messages on server: " + extras.toString()); } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE .equals(messageType)) { for (int i = 0; i < 3; i++) { Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); try { Thread.sleep(5000); } catch (InterruptedException e) { } } Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); sendNotification("" + extras.get(Config.MESSAGE_KEY)); Log.i(TAG, "Received: " + extras.toString()); } } GcmBroadcastReceiver.completeWakefulIntent(intent); } private void sendNotification(String msg) { Log.d(TAG, "Preparing to send notification...: " + msg); mNotificationManager = (NotificationManager) this .getSystemService(Context.NOTIFICATION_SERVICE); //here start Intent gcmintent = new Intent(this, AppGcmStation.class); gcmintent.putExtra("ntitle", msg); gcmintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); int requestID = (int) System.currentTimeMillis(); //here end PendingIntent contentIntent = PendingIntent.getActivity(this, requestID, gcmintent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( this).setSmallIcon(R.drawable.ic_launcher) .setContentTitle("my title") .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg); mBuilder.setAutoCancel(true); mBuilder.setTicker(msg); mBuilder.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }); mBuilder.setLights(Color.RED, 3000, 3000); mBuilder.setContentIntent(contentIntent); mBuilder.setDefaults(Notification.DEFAULT_SOUND); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); Log.d(TAG, "Notification sent successfully."); } } 

我需要最好和最简单的方法来生成一个int增量id为通知ID分配。

Solutions Collecting From Web of "生成int唯一标识为android通知ID"

对于所有通知,您都使用相同的通知ID(值始终为1)。 您可能应该将通知ID分隔成单独的单例类:

 public class NotificationID { private final static AtomicInteger c = new AtomicInteger(0); public static int getID() { return c.incrementAndGet(); } } 

然后在代码中使用NotificationID.getID()而不是NOTIFICATION_ID

编辑:作为@racs在评论中指出,上述方法是不够的,以确保适当的行为,如果你的应用程序进程恰好被杀害。 至less, AtomicInteger的初始值应该从某个活动的保存状态初始化,而不是从0开始。如果通知ID在重新启动应用程序时需要是唯一的(同样,应用程序进程可能会被终止),那么最新的值应该保存在每个增量后的某个地方(可能是共享的前缀),并在应用程序启动时恢复。

任何人仍然环顾四周。 我生成了一个时间戳,并用它作为ID。

 import java.util.Date; import java.util.Locale; public int createID(){ Date now = new Date(); int id = Integer.parseInt(new SimpleDateFormat("ddHHmmss", Locale.US).format(now)); return id; } 

像这样使用它

 int id = createID(); mNotifyManager.notify(id, mBuilder.build()); 
 private static final String PREFERENCE_LAST_NOTIF_ID = "PREFERENCE_LAST_NOTIF_ID"; private static int getNextNotifId(Context context) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); int id = sharedPreferences.getInt(PREFERENCE_LAST_NOTIF_ID, 0) + 1; if (id == Integer.MAX_VALUE) { id = 0; } // isn't this over kill ??? hahaha!! ^_^ sharedPreferences.edit().putInt(PREFERENCE_LAST_NOTIF_ID, id).apply(); return id; } 

如果有人读这个,这里有一个方法。 最好用id指定一个tag名称,这样如果你把这个部件打包成一个模块与开发者分享,这将会有所帮助。

注:分配一些随机的整数ID的问题是,如果任何模块或库使用相同的ID,您的通知将被replace为新的通知数据。

 // here createID method means any generic method of creating an integer id int id = createID(); // it will uniqly identify your module with uniq tag name & update if present. mNotifyManager.notify("com.packagename.app", id, mBuilder.build());