我有弹出通知的活动。为此我从WebService
得到所有五个时间值。它们是不同的时间(没有模式)。所以我使用AlarmManager
设置通知如下。
Intent[] intentArr = new Intent[5];
PendingIntent[] pendingIntent = new PendingIntent[5];
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
for (int x = 0; x < 5; x++) {
intentArr[x] = new Intent(con, NotificationIntentService.class);
intentArr[x].putExtra("gamePlayerId", bamDaoList.get(x).getGamePlayerId());
intentArr[x].putExtra("bamReactionId",bamDaoList.get(x).getBamReactionId());
pendingIntent[x] = PendingIntent.getBroadcast(con, x, intentArr[x],PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, time[x], pendingIntent[x]);
}
这会弹出通知。但不是在确切的时间。有没有办法做到这一点或我的代码有什么问题?
NotificationIntentService.class
用于定义通知。
答案 0 :(得分:1)
在我的应用程序中,我正在做同样的事情。我使用闹钟管理器进行提醒。
为了做到这一点,我使用以下代码:
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context.getApplicationContext(), AlarmReceiver.class);
intent.setData(Uri.parse("custom://" + objectId)); // objectId is the identifier (in my app its a string)
intent.setAction(objectId);
intent.putExtra(Constants.FIELD_OBJECT_ID, objectId);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.SECOND, 0); // Zeros seconds
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), alarmIntent);
让我解释一下,
然后我创建一个日历实例,在其中设置一个Date对象,并将秒设置为0,以确保它将准确地按时触发
最后我设置了闹钟管理器
在您的代码中,您不需要创建待处理意图数组,您可以将此代码包装在将接收objectId,Date和Context的方法中,并在每次需要时使用相关的id调用它,然后在广播接收器你将提取objectId并用它做一些事情。
为了测试我建议现在用+10或15秒获得时间 从现在起15秒后得到时间请使用以下方法
public static Calendar calWithSecondsFromNow(int seconds) {
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.SECOND, seconds);
return cal;
}
此方法将使用+将发送给参数的秒数返回日期。 取结果并将其放入set方法中。
另外请确保您在manifest.xml文件中注册了广播接收器
让我知道它是否有效。
希望有所帮助
答案 1 :(得分:1)
如果您的<HTML>
<HEAD>
<TITLE>Welcome Applet</TITLE>
</HEAD>
<BODY>
<OBJECT CODE="WelcomeApplet.class" WIDTH="440" HEIGHT="50">
</OBJECT>
</BODY>
</HTML>
&gt; = 19,那么您需要使用:
targetSdkVersion
从api level 19开始,alarmManager.setExact(...);
并不保证确切的交付时间。请参阅AlarmManager.set(...)
的文档。
http://developer.android.com/reference/android/app/AlarmManager.html
注意:从API 19开始,传递给此方法的触发时间被视为不精确:警报将不会在此时间之前传递,但可能会延迟并在稍后传递。操作系统将使用此策略以便批量处理&#34;在整个系统中一起报警,最大限度地减少设备需要“唤醒”的次数。并尽量减少电池使用。一般而言,只要将来安排的警报很长,就不会推迟在不久的将来安排的警报。
使用新的批处理政策,交付订单保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报可能会发出警报。实际交货订单可能与其请求的交货时间顺序不符。如果您的应用程序具有强大的订购要求,则可以使用其他API来获取必要的行为;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
targetSdkVersion在API 19之前的应用程序将继续获得先前的警报行为:所有计划的警报将被视为完全警告。