2

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

这是有效的,但是当同一个广播接收机需要在短时间内接收到多个意图时(一分钟内f.ex.),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); 

和广播接收器的方法的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()) 
} 

在我做错了什么建议?

回答

2

相反的set()可以奇巧后使用setExact()

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),我不知道这是什么造成的问题,但它可能是,你可以设置一个不同势requestCode每个的PendingIntent是这样的:在

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(); 
+0

现货,这正是问题所在。非常感谢你! – user5102612

+0

我的荣幸! :3 –