【问题标题】:Multiple intents but Broadcast receiver only called once多个意图,但广播接收器只调用一次
【发布时间】:2016-07-23 13:20:38
【问题描述】:

我想在特定时刻执行数据库操作,并结合广播接收器使用警报管理器和未决意图。

这可行,但是当同一个广播接收器必须在短时间内(例如在一分钟内)接收多个意图时,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())
}

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

【问题讨论】:

    标签: android broadcastreceiver alarmmanager android-pendingintent


    【解决方案1】:

    你可以在 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),我不确定这是否是导致问题的原因,但可能是,您可以为每个 pendingIntent 设置不同的 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();
    

    【讨论】:

    • 正确,这正是问题所在。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多