【发布时间】:2018-05-15 15:52:07
【问题描述】:
我已经实现了一个处理通知的应用程序,它以编程方式设置,代码如下:
public void setAlarm(Cell cell, Long timeStamp, String title, String message) {
Integer id = (int) System.currentTimeMillis();
Intent notificationIntent = new Intent(context, receiver);
notificationIntent.putExtra("ID", id);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, notificationIntent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
assert alarmManager != null;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeStamp, 2 * 60 * DateUtils.SEC_TO_MILLIS, pendingIntent);
RepositoryManager repositoryManager = RepositoryManager.getInstance();
repositoryManager.storeNotificationAdministration(new NotificationAdministration(id, timeStamp, 2, title, message, 1, null, cell, StatusNotification.NOT_YET_NOTIFIED.getId()));
}
这是我的接收器:
@Override
public void onReceive(Context context, Intent intent) {
RepositoryManager controllerDatabase = RepositoryManager.getInstance(ControllerDatabase.getInstance(context));
NotificationMedicine notificationMedicine = controllerDatabase.getNotificationMedicine();
if (notificationMedicine.getEnable()) {
if (intent.hasExtra("ID")) {
int id = intent.getIntExtra("ID", 0);
NotificationManager mNotifyMgr =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Log.d("DEBUG", "MyReceiverAdministration " + id);
try {
NotificationAdministration notificationAdministration = controllerDatabase.findNotificationAdministrationById(id);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_medicine)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.setContentTitle(notificationAdministration.getTitle())
.setContentText(notificationAdministration.getMessage())
.setOngoing(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(false);
Intent i = new Intent(context, MainActivity.class);
i.putExtra(SettingsData.TAG_CELL, notificationAdministration.getCell().getId());
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
notificationAdministration.getId(),
i,
0
);
Intent snoozeIntent = new Intent(context, MyFlagBroadcastReceiver.class);
snoozeIntent.putExtra(SettingsData.TAG_CELL, notificationAdministration.getId());
PendingIntent flagIt =
PendingIntent.getBroadcast(context, 0, snoozeIntent, 0);
mBuilder.setLights(0x6098CF, 1000, 2000);
Uri uriRingtone = notificationMedicine.getRingtone();
mBuilder.setSound(uriRingtone);
mBuilder.setContentIntent(pendingIntent);
mBuilder.addAction(R.drawable.ic_timer_black_24dp, context.getString("Do my action"), flagIt);
mNotifyMgr.notify(notificationAdministration.getId(), mBuilder.build());
Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(700);
notificationAdministration.setStatus(StatusNotification.NOTIFIED.getId());
controllerDatabase.storeNotificationAdministration(notificationAdministration);
} catch (ObjectNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
这是其他Receiver,当用户点击通知的动作时:
RepositoryManager controllerDatabase = RepositoryManager.getInstance(ControllerDatabase.getInstance(context));
if (intent.hasExtra(SettingsData.TAG_CELL)) {
int id = intent.getIntExtra(SettingsData.TAG_CELL, 0);
try {
NotificationAdministration notificationAdministration = controllerDatabase.findNotificationAdministrationById(id);
Device device = controllerDatabase.getDefaultDeviceByUser(controllerDatabase.getLoggedUser().getUser());
Cell cell = controllerDatabase.findCellById(device, notificationAdministration.getCell().getId());
Calendar calendar = Calendar.getInstance();
Long now = calendar.getTimeInMillis() / DateUtils.SEC_TO_MILLIS;
controllerDatabase.flagMedicineTaken(cell, now);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (mNotificationManager != null) {
mNotificationManager.cancel(id);
}
} catch (ObjectNotFoundException e) {
e.printStackTrace();
}
}
我面临的问题是 MyFlagBoradcastReceiver 始终获得相同的通知 ID,而不是我正在按下/单击的那个。
该应用程序的想法是设置不同的通知,这些通知始终可见,直到用户单击通知的操作。警报也应在 2 分钟后触发...
** 更新 **
这是我应该用来取消警报的代码行;我应该使用什么作为接收器?
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(context,
receiver);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, notificationAdministration.getId(), myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
alarmManager.cancel(pendingIntent);
}
【问题讨论】:
标签: android android-intent alarmmanager android-notifications android-pendingintent