无法在不同时间获得多个通知
Unable to get multiple notifications at different time
我正在尝试在用户单击按钮时在特定时间设置通知。
像这样:
// make this duration fifteen minutes before startTime
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
for (int i=0; i<10; ++i) {
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i));
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
intentArray.add(pendingIntent);
}
Long.parseLong(holder.handlerGapTV.getText().toString())
已计算为:
try {
Date date3 = todayTimeDateFormat.parse(todayTimeDate);
Date date4 = todayTimeDateFormat.parse(newTime);
holder.handlerGap = date4.getTime() - date3.getTime();
holder.handlerGapTV.setText(String.valueOf(holder.handlerGap));
holder.handlerGapTV.setVisibility(View.INVISIBLE);
Log.d("handlerGapTV.getText()", holder.handlerGapTV.getText().toString());
} catch (ParseException e) {
e.printStackTrace();
}
这里是 getNotification()
:
private Notification getNotification(int repeat) {
mBuilder =
new NotificationCompat.Builder(itemView.getContext())
.setSmallIcon(R.mipmap.app_icon_1)
.setContentTitle("Notif title")
.setContentText("Notif text");
Intent resultIntent = new Intent(itemView.getContext(), AcceptedRequest.class);
// Because clicking the notification opens a new ("special") activity, there's
// no need to create an artificial back stack.
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
itemView.getContext(),
repeat,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
return mBuilder.build();
}
这里是 NotificationARBroadcastReceiver.java
:
public class NotificationARBroadcastReceiver extends BroadcastReceiver {
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
NotificationManager mNotifyMgr =
(NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
Notification notification = intent.getParcelableExtra(NOTIFICATION);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
mNotifyMgr.notify(m, notification);
}
}
问题 是 Long.parseLong(holder.handlerGapTV.getText().toString())
与按钮所在的 CardView
不同,假设如果是 100
秒对于 card1 的按钮,它是 65
对于 card2 的按钮,如果我先按 card2 按钮然后按 card2 按钮,通知将根据 card2 的时间设置,即 100
并且 card1 的时间通知从不已显示!
我想要的 是显示每个通知是否设置在 100
秒后或 65
.
请帮我解决这个问题。
好吧,从这里更改代码:
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
for (int i=0; i<10; ++i) {
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i));
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
intentArray.add(pendingIntent);
}
对此:
int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
// make this duration fifteen minutes before startTime
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification());
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), m, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
对我有用!
我正在尝试在用户单击按钮时在特定时间设置通知。
像这样:
// make this duration fifteen minutes before startTime
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
for (int i=0; i<10; ++i) {
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i));
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
intentArray.add(pendingIntent);
}
Long.parseLong(holder.handlerGapTV.getText().toString())
已计算为:
try {
Date date3 = todayTimeDateFormat.parse(todayTimeDate);
Date date4 = todayTimeDateFormat.parse(newTime);
holder.handlerGap = date4.getTime() - date3.getTime();
holder.handlerGapTV.setText(String.valueOf(holder.handlerGap));
holder.handlerGapTV.setVisibility(View.INVISIBLE);
Log.d("handlerGapTV.getText()", holder.handlerGapTV.getText().toString());
} catch (ParseException e) {
e.printStackTrace();
}
这里是 getNotification()
:
private Notification getNotification(int repeat) {
mBuilder =
new NotificationCompat.Builder(itemView.getContext())
.setSmallIcon(R.mipmap.app_icon_1)
.setContentTitle("Notif title")
.setContentText("Notif text");
Intent resultIntent = new Intent(itemView.getContext(), AcceptedRequest.class);
// Because clicking the notification opens a new ("special") activity, there's
// no need to create an artificial back stack.
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
itemView.getContext(),
repeat,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
return mBuilder.build();
}
这里是 NotificationARBroadcastReceiver.java
:
public class NotificationARBroadcastReceiver extends BroadcastReceiver {
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
NotificationManager mNotifyMgr =
(NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
Notification notification = intent.getParcelableExtra(NOTIFICATION);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
mNotifyMgr.notify(m, notification);
}
}
问题 是 Long.parseLong(holder.handlerGapTV.getText().toString())
与按钮所在的 CardView
不同,假设如果是 100
秒对于 card1 的按钮,它是 65
对于 card2 的按钮,如果我先按 card2 按钮然后按 card2 按钮,通知将根据 card2 的时间设置,即 100
并且 card1 的时间通知从不已显示!
我想要的 是显示每个通知是否设置在 100
秒后或 65
.
请帮我解决这个问题。
好吧,从这里更改代码:
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
for (int i=0; i<10; ++i) {
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i));
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
intentArray.add(pendingIntent);
}
对此:
int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
// make this duration fifteen minutes before startTime
long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString());
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class);
notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification());
PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), m, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
对我有用!