如何在不同时段开始通知

时间:2015-12-02 04:18:10

标签: android notifications alarmmanager

我有弹出通知的活动。为此我从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用于定义通知。

2 个答案:

答案 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);

让我解释一下,

  1. 我设置了警报管理器实例
  2. 我用广播接收器创建一个新意图(不要忘记在manifest.xml中注册广播接收器)
  3. 我使用动作以便知道我设置此警报的ID,所以当警报触发时我将能够提取此objectId并对其执行某些操作..
  4. 然后我创建一个日历实例,在其中设置一个Date对象,并将秒设置为0,以确保它将准确地按时触发

  5. 最后我设置了闹钟管理器

  6. 在您的代码中,您不需要创建待处理意图数组,您可以将此代码包装在将接收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之前的应用程序将继续获得先前的警报行为:所有计划的警报将被视为完全警告。