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 –