私は1つの通知のみを受信していますが、別の通知が来た場合は、以前の通知を置き換えます、ここに私のコードがあります
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);
}
私はこのような問題を解決しました...
/**
* 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());
}
あなたの行をこれに置き換えてください
notificationManager.notify(Unique_Integer_Number, notification);
それがあなたを助けることを願っています。
単純な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);
共有設定を使用するとうまくいきました
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();
これで行を置き換えます。
notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);
これは誰かを助けると思います。
以下のコード「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;
}
uniqueIntNo
の場所に、次のような一意の整数を置きます。
mNotificationManager.notify(uniqueIntNo, builder.build());
通知が互いに結合しないように、各通知に一意のIDを追加する必要があります。参照用にこのリンクを使用できます:
https://github.com/sanathe06/AndroidGuide/tree/master/ExampleCompatNotificationBuilder
それを行う別の方法は、現在の日付を長さに変換し、最後の4桁を取得することです。番号が一意になる可能性が高くなります。
long time = new Date().getTime();
String tmpStr = String.valueOf(time);
String last4Str = tmpStr.substring(tmpStr.length() -5);
int notificationId = Integer.valueOf(last4Str);
1行をnotificationManager.notify(0, notification);
からnotificationManager.notify((int) System.currentTimeMillis(), notification);
に変更するだけです...
これにより、新しい通知が表示されるたびに通知のIDが変更されます
notificationManager.notify(0, notification);
putthis new Random().nextInt() in position of 0
like below it works for me
notificationManager.notify(new Random().nextInt(), notification);
以下は、一意の通知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.
私は1000でやったように、特定の範囲でsavedPreferencesのnotificationIdをリセットします。これにより、今後問題が発生することはありません。より詳細な情報やクエリが必要な場合はお知らせください。 :)
問題はnotificationId
にあります。配列インデックスと考えてください。通知を更新するたびに、notificationId
は値を保存するために必要な場所です。 int値(この場合はnotificationId
)をインクリメントしていないため、これは常に以前の値を置き換えます。私が推測する最良の解決策は、通知を更新した直後にインクリメントすることです。永続的に保持する場合は、notificationId
の値をsharedPreferences
に保存できます。戻ってきたときはいつでも、最後の整数値(notificationId
をsharedPreferences
に保存)を取得して使用できます。
コードで次のメソッドを使用します。
メソッド呼び出し:-
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;
}