【发布时间】:2016-07-14 16:38:39
【问题描述】:
我正在制作一个考勤跟踪系统。 所以,我需要在上课前和上课后发出通知。
主要方法是我从数据库中为每门课程创建通知的地方。
mainMethod() {
testAlarmA(s[0], s[2]);
testAlarmB(s[0], s[2]);
}
我已经为每个意图实现了 setAction() 方法,并且对于每个待处理的意图也有不同的请求代码(我已经在本网站的早期问题中阅读了这些)
private void testAlarmA (String code) {
Log.i("attendance", "class-start");
AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
Intent notificationIntent = new Intent("android.media.action.DISPLAY_ATTENDANCE_NOTIFICATION");
notificationIntent.addCategory("android.intent.category.DEFAULT");
notificationIntent.putExtra("type", "start");
notificationIntent.putExtra("courseCode", code);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, 1);
PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 111, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (2 * 60 * 1000), broadcast);
}
private void testAlarmB (String code){
Log.i("attendance", "class-end");
AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
Intent notificationIntent = new Intent("android.media.action.DISPLAY_ATTENDANCE_NOTIFICATION");
notificationIntent.addCategory("android.intent.category.DEFAULT");
notificationIntent.putExtra("type", "end");
notificationIntent.putExtra("courseCode", code);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE, 2);
PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 222, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (2 * 60 * 1000), broadcast);
}
在广播接收器类中,我正在提取额外信息以知道要触发哪个通知,即类开始或结束。
但只有类开始通知是接收者,类结束日志条目从不显示。
@Override
public void onReceive(Context context, Intent intent) {
Log.i("time", "onReceive");
mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager = mNotificationManager;
if (intent.getExtras().containsKey("type")) {
Log.i("time", "containsKey");
String type = intent.getExtras().getString("type");
if (type.equals("end")) {
Log.i("time", "end");
endNotif(context);
} else if (type.equals("start")) {
Log.i("time", "start");
startNotif(context);
}
}
}
我还有通知生成器的用户唯一 ID。
private void startNotif (Context context) {
Intent notificationIntent = new Intent();
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setContentTitle("You Have " + courseCode + " at " + roomNo)
.setContentIntent(pendingIntent)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setPriority(Notification.PRIORITY_DEFAULT)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_library_books_white_24dp)
.setLights(0xff00ff00, 1000, 1000)
.setAutoCancel(true);
mNotificationManager.notify(1, mBuilder.build());
}
我的结束类通知将有 3 个不同的操作按钮。
private void endNotif (Context context) {
Intent notificationIntent = new Intent(context, AttendanceActivity.class);
notificationIntent.putExtra("courseCode", courseCode);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Intent classAttended = new Intent(context, AttendanceNotificationServiceClass.class);
classAttended.setAction("action");
classAttended.putExtra("courseCode", courseCode);
classAttended.putExtra("class", "attended");
PendingIntent pClassAttended = PendingIntent.getService(context, 11, classAttended, PendingIntent.FLAG_UPDATE_CURRENT);
Intent classBunked = new Intent(context, AttendanceNotificationServiceClass.class);
classBunked.setAction("action");
classBunked.putExtra("courseCode", courseCode);
classBunked.putExtra("class", "bunked");
PendingIntent pClassBunked = PendingIntent.getService(context, 22, classBunked, PendingIntent.FLAG_UPDATE_CURRENT);
Intent classOff = new Intent(context, AttendanceNotificationServiceClass.class);
classOff.setAction("action");
classOff.putExtra("courseCode", courseCode);
classOff.putExtra("class", "off");
PendingIntent pClassOff = PendingIntent.getService(context, 33, classOff, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_library_books_white_24dp)
.setContentTitle(courseCode + " Just Ended")
.setContentText("Did you attend " + courseCode + " ?")
.addAction(R.drawable.ic_thumb_up_white_24dp, "Attended", pClassAttended)
.addAction(R.drawable.ic_thumb_down_white_24dp, "Bucked", pClassBunked)
.addAction(R.drawable.ic_clear_white_24dp, "Class Off", pClassOff)
.setContentIntent(pendingIntent)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setPriority(Notification.PRIORITY_HIGH)
.setLights(0xff00ff00, 1000, 1000)
.setAutoCancel(true);
mNotificationManager.notify(0, mBuilder.build());
}
但是当我启动应用程序时,1 分钟后只显示开课通知。课程结束通知应该在课程开始通知后 1 分钟显示。
开始通知按应有的方式显示,即每分钟之后。 但是从不显示结束通知,甚至一次也没有。
如果在 testAlarmA() 和 testAlarmB() 方法中,我进行了更改,以便在 testAlarmA() 之前触发 testAlarmB(),则只会显示 B/end。永远不会显示 A/start。
我的日志
07-14 22:04:49.258 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:04:49.286 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:04:49.287 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:06:29.165 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:06:29.173 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:06:29.173 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:07:59.689 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:07:59.690 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:07:59.690 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:09:52.756 30137-30143/in.ac.iitd.bsw.iitdapp W/art: Suspending all threads took: 5.590ms
07-14 22:10:29.623 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:10:29.624 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:10:29.624 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:13:23.618 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:13:23.618 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:13:23.657 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
【问题讨论】:
标签: android android-intent notifications android-alarms