我有一个我从github抓取的日历库:https://github.com/prolificinteractive/material-calendarview
我让用户点击日期并为该日期添加提醒,然后会弹出一个警告对话框,并要求他们输入当天想要提醒的时间。
现在我能够将文本转换为简单格式,然后将其从日历对象中吐出到字符串中,因此日期和时间应该通过通知。但它似乎无论如何都不起作用
下面是设置警报的代码:
Calendar cal = Calendar.getInstance();
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
notificationIntent.addCategory("android.intent.category.DEFAULT");
PendingIntent broadcast = PendingIntent.getService(context, 100, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
try {
cal.setTime(alertFormatter.parse(date));
System.out.print("Date added successfully");
} catch (ParseException e) {
System.out.println("Failed to add date");
}
cal.add(Calendar.HOUR, Integer.parseInt(hour.getText().toString()));
cal.add(Calendar.MINUTE, Integer.parseInt(minute.getText().toString()));
cal.add(Calendar.SECOND, 0);
if(spAMpm.getSelectedItem().equals("AM"))cal.add(Calendar.AM_PM, Calendar.AM);
else if (spAMpm.getSelectedItem().equals("PM"))cal.add(Calendar.AM_PM, Calendar.PM);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast);
然后我创建的接收器做了我需要做的事情:
public class UpcomingWorkNotification extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent notificationIntent = new Intent(context, UpcomingWork.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(UpcomingWork.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Four.oh")
.setContentText("Assignment Due Soon!")
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, builder.build());
}
}
在清单中我给了它这个权限并添加了接收器
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<receiver android:name=".UpcomingWorkNotification">
<action android:name="android.media.action.DISPLAY_NOTIFICATION" />
<category android:name="android.intent.category.DEFAULT" />
</receiver>
答案 0 :(得分:2)
我玩了一段时间,看起来你有一些问题。一个是这一行,
PendingIntent broadcast = PendingIntent.getService(context, 100, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
您使用getService()
,但后来有BroadcastReceiver
。我构建了一个测试设置,如果我PendingIntent.getService()
,我的BroadcastReceiver
从未启动过。但如果我将其切换为PendingIntent.getBroadcast()
,那么BroadcastReceiver
就会启动。 PendingIntent.getBroadcast()
采用与getService()
相同的参数。
另一条似乎有问题的是,
Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
有了这条线,接收器从未发射过。我不得不将其更改为以下内容,
Intent notificationIntent = new Intent(theAppropriateContext, UpcomingWorkNotification.class);
notificationIntent.setAction("android.media.action.DISPLAY_NOTIFICATION");
我使用过的一些参考文献,很棒的Vogella tutorials以及之前的question on StackOverflow。
在我链接的SO答案中,他们似乎通过在清单中使用intent-filter来解决问题。但是,我测试了使用和不使用intent-filter,两种情况都有效。尽管将intent-filter放在这里可能会更好,
<receiver android:name=".AlarmNotification">
<action android:name = "android.media.action.DISPLAY_NOTIFICATION"/>
<category android:name="android.intent.category.DEFAULT"/>
</receiver>
编辑:预防后做了一些额外的测试。使用Intent.setAction()时,它没有intent-filter。但是,如果我使用了一个intent-filter,那么就像你拥有的那样,
Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
确实有效。这样做的好处是Intent.setAction()需要最小的sdk版本19.因此,如果使用intent-filter,则可以支持较低的sdk版本。