生成int唯一ID作为android通知ID

当我发送多个推送通知时,我需要将它们全部显示在按发送desc的时间排序的通知栏中。我知道我应该使用唯一的通知-

我尝试生成随机数,但这不能解决我的问题,因为我需要对它们进行订购。我尝试使用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可以递增以将其分配为通知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在评论中指出的那样,如果您的应用程序进程被杀死,上述方法不足以确保行为正确。至少AtomicInteger应从某些活动的保存状态(而不是从0开始)初始化的初始值。如果通知ID在应用程序的重新启动期间需要唯一(同样,应用程序进程可能会被终止),则最新值应在每次增量后保存在某个位置(可能保存到共享首选项),并在应用启动时恢复。

以上是 生成int唯一ID作为android通知ID 的全部内容, 来源链接: utcz.com/qa/402494.html

回到顶部