2

Ich möchte eine Datenbankoperation zu bestimmten Zeitpunkten durchführen und einen Alarm-Manager und eine ausstehende Absicht in Verbindung mit einem Broadcast-Empfänger verwenden.Mehrere Absichten aber Broadcast-Empfänger nur einmal angerufen

Dies funktioniert, aber wenn es mehrere Absichten gibt, die derselbe Rundfunkempfänger innerhalb eines kurzen Zeitrahmens empfangen muss (zum Beispiel innerhalb einer Minute), wird onreceive() nur einmal aufgerufen.

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); 

und die OnReceive Methode des broadcastreceiver:

@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()) 
} 

Irgendwelche Vorschläge auf, was ich falsch mache?

Antwort

2

Statt set() können Sie setExact() nach KITKAT verwenden:

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

Der zweite Parameter in getBroadcast() ist die requestCode, die funktioniert, als ob es sich um eine ID war, so, jeder PendingIntent sollte eine eindeutige requestCode haben (auch bekannt als ICH WÜRDE). Alle Ihre pendingIntent1 ‚s die gleiche requestCode (0), ich bin nicht sicher, ob das, was das Problem verursacht, aber es könnte sein, Sie eine diffrent requestCode für jeden PendingIntent wie folgt einstellen:

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

Spot on, Genau das war das Problem. Vielen Dank! – user5102612

+0

Mein Vergnügen! :3 –

Verwandte Themen