使用WakefulIntentService调度多个警报

时间:2013-02-05 10:06:47

标签: android commonsware-cwac

我正在尝试安排几个闹钟以将帖子发布到Twitter。我不确定用法,因为我得到一个NullPointerException。

我有一个帖子列表,我想将它们发布到Twitter,所以这就是我所做的。 在WakefulIntentService类的scheduleAlarms方法中,我有一个for循环迭代帖子List并将一个post对象添加到putExtra方法:

public static void scheduleAlarms(AlarmListener listener, Context ctxt,
        boolean force) {
    SharedPreferences prefs = ctxt.getSharedPreferences(NAME, 0);
    long lastAlarm = prefs.getLong(LAST_ALARM, 0);

    if (lastAlarm == 0
            || force
            || (System.currentTimeMillis() > lastAlarm && System
                    .currentTimeMillis() - lastAlarm > listener.getMaxAge())) {
        AlarmManager mgr = (AlarmManager) ctxt
                .getSystemService(Context.ALARM_SERVICE);
        for (Iterator<Post> iterator = AlarmActivity.posts.iterator(); iterator
                .hasNext();) {
            Post post = (Post) iterator.next();

            Intent i = new Intent(ctxt, AlarmReceiver.class);
            i.putExtra("post", post);
            PendingIntent pi = PendingIntent.getBroadcast(ctxt,
                    (int) post.getId(), i, 0);
            listener.scheduleAlarms(mgr, pi, ctxt);
        }

    }
}

然后在我的AppService doWakefulWork方法中,我获得了Parcelable post对象,但是我得到了nullpointerexception:

@Override
protected void doWakefulWork(Intent intent) {
    Log.i("AppService", "I'm awake! I'm awake! (yawn)");
    Post post = intent.getParcelableExtra("post");
    System.out.println("- " + post.getPost());
}

这是做我想做的事的正确方法吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

  

NullPointerException指出intent.getParcelableExtra(“post”)为空。

我的猜测是,BroadcastReceiver并未将post个额外信息转发给服务,而是调用sendWakefulWork()

  

这是做我想做的事的正确方法吗?

可能不会,因为您只会发送一个帖子,而忽略所有其他帖子,如果用户关闭电源或重新启动设备,您甚至无法正确执行此操作。

使用一个 PendingIntent 一个预定闹钟。由于您的帖子需要位于持久性数据存储中,因此请WakefulIntentService加载要从数据存储发送的帖子。消除PendingIntent中的所有额外内容,因为它们不再需要,并且在断电或重启事件时无法轻松重建。