当我发送多个推送通知时,我需要它们全部显示在发送时间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。
答案 0 :(得分:78)
您为所有通知使用相同的通知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
。
AtomicInteger
的初始值,而不是从0开始。如果通知ID在应用程序重新启动时需要是唯一的(同样,应用程序进程可能是杀死),然后在每次增量后将最新值保存在某处(可能是共享的首选项),并在应用程序启动时恢复。
答案 1 :(得分:22)
对于仍然环顾四周的人。我生成了一个时间戳并将其用作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());
答案 2 :(得分:12)
import sys, os, re, shlex, urllib, subprocess
cmd='dig' -x 8.8.8.8 @192.1.1.1
proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
out, err = proc.communicate()
sys.stdout = open("/tmp/test.txt", "w")
print(out)
sys.stdout.close()
答案 3 :(得分:2)
您可以使用计数器并将其存储在SharedPreferences中。 这是kotlin中的一个示例:
fun getNextNotificationId(context: Context) : Int {
val sp = context.getSharedPreferences("your_shared_preferences_key", MODE_PRIVATE)
val id = sp.getInt("notification_id_key", 0)
sp.edit().putInt("notification_id_key", (id + 1) % Int.MAX_VALUE).apply()
return id
}
它将获得ID,并将存储下一个ID(增加1),如果ID达到整数的最大值,它将重置为0。
您可以像这样使用它:
val notificationId = getNextNotificationId(applicationContext)
notificationManager.notify(notificationId, yourNotification)
答案 4 :(得分:2)
可能不是最好的,但是肯定最简单的是使用当前时间。
int oneTimeID = (int) SystemClock.uptimeMillis();
mNotificationManager.notify(oneTimeID, mBuilder.build());
优点:这是获得越来越多id的最简单方法。
不好的是:时间是long
,我们将其缩短为一半。这意味着计数器将每2'147'483'647 / 1000(ms-> s)/ 60(s-> m)/ 60(m-> h)/ 24(h-> d)==环绕25天。
SystemClock.uptimeMillis()
比currentTimeMillis
有2个优点:
答案 5 :(得分:0)
如果有人在阅读此内容,则有方法here。最好同时使用tag
指定id
名称,这样如果您将该部件捆绑为模块以与开发人员共享,它将会有所帮助。
注意:分配一些随机整数id的问题是,如果任何模块或库使用相同的ID,您的通知将被新的通知数据替换。
// 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());
答案 6 :(得分:0)
您需要设置唯一的标记(字符串)/ id(整数)
Checkout this method in official documentaation
我建议在通知时使用任何时间戳记(SystemClock.uptimeMillis()/ System.currentTimeMillis())作为标记。
notificationManager.notify(String.valueOf(System.currentTimeMillis()), 0, notification);