android - 多个 Intent ,但广播接收器仅调用一次

标签 android broadcastreceiver alarmmanager android-pendingintent

我想在特定时刻执行数据库操作,并将警报管理器和待处理 Intent 与广播接收器结合使用。

这是可行的,但是当同一个广播接收器必须在短时间内(例如一分钟内)接收多个 Intent 时, onreceive() 只会被调用一次。

  Intent intent2 = new Intent(this, CustomBroadcastReceiver.class);
    intent2.putExtra("taskId", currentTask.getTaskId());
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() +
            ((long) dataSource.fetchTask(task.getTaskId()).getTaskTime() * 60 * 1000), pendingIntent1);

以及broadcastreceiver的onreceive方法:

  @Override
public void onReceive(Context context, Intent intent) {
    dataSource = new DataSourceClass(context);
    dataSource.open();

    int taskId = intent.getIntExtra("taskId", 0);

    dataSource.setTaskStatus(3, taskId);
    dataSource.setCatInActive(dataSource.fetchTask(taskId).getTaskCategory())
}

对我做错了什么有什么建议吗?

最佳答案

您可以在 KITKAT 之后使用 setExact(),而不是 set():

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);
    }

getBroadcast() 中的第二个参数是 requestCode,它的作用就像一个 ID,因此,每个 PendingIntent 都应该有一个唯一的 requestCode(又名 ID)。您的所有 pendingIntent1 都有相同的 requestCode (0),我不确定这是否是导致问题的原因,但可能是,您可以为每个endingIntent 设置不同的 requestCode,如下所示:

    int i = sharedPrefs.getInt("i", 0);

    Intent intent2 = new Intent(this, CustomBroadcastReceiver.class);
    intent2.putExtra("taskId", currentTask.getTaskId());
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, i++, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() +
            ((long) dataSource.fetchTask(task.getTaskId()).getTaskTime() * 60 * 1000), pendingIntent1);

    sharedPrefs.edit.putInt("i", i).apply();

关于android - 多个 Intent ,但广播接收器仅调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542256/

相关文章:

java - 如何在android中使用java在mysql数据库中保存值

android - 查询 MediaStore.Images.Media ,如何同时查询 EXTERNAL_CONTENT_URI 和 INTERNAL_CONTENT_URI?

Android:ACTION_PACKAGE_FULLY_REMOVED 和 ACTION_PACKAGE_REMOVED 之间的区别

android - 如何配置通知 channel 以显示多个通知

android - 使用 AlarmManager 和 Broadcast Receiver 启动 Android 服务

java - 在指定日期之前在 Android 中通知

android - 如何在编辑文本的边框上书写

Android WiFi 状态监听器

android - 如何确定是否处于车载模式(Android)?

android - 警报在创建后立即运行