複数のプッシュ通知を送信する場合、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(値は常に1)を使用しています。おそらく通知IDを個別のシングルトンクラスに分離する必要があります。
_public class NotificationID {
private final static AtomicInteger c = new AtomicInteger(0);
public static int getID() {
return c.incrementAndGet();
}
}
_
次に、コードで_NOTIFICATION_ID
_の代わりにNotificationID.getID()
を使用します。
編集:@racsがコメントで指摘しているように、上記のアプローチでは、アプリプロセスが強制終了した場合に適切な動作を保証するのに十分ではありません。少なくとも、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;
}
最善ではないかもしれませんが、間違いなく最も単純なは現在の時刻を使用することです。
_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つの利点があります。
カウンターを使用して、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)
誰かがこれを読んでいる場合、 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());