Più chiamate a AlarmManager.setRepeating offrono gli stessi valori PendingIntent Intent / extra, ma ho fornito quelli diversi

StackOverflow https://stackoverflow.com/questions/2844274

Domanda

risolto durante la scrittura di questa domanda, ma il distacco in caso aiuta qualcuno:

Sono la creazione di più allarmi come questo, con diversi valori di id:

AlarmManager alarms = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM);  // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id);  // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p);  // 5 mins

... e la ricezione di loro in questo modo:

public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_ALARM)) {
        // It's time to sound/show an alarm
        final long id = intent.getLongExtra(EXTRA_ID, -1);

L'allarme viene consegnato al mio ricevitore al momento giusto, ma spesso con EXTRA_ID impostato al valore sbagliato: si tratta di un valore che ho usato ad un certo punto, non solo quello che volevo consegnato in quel particolare momento <. / p>

È stato utile?

Soluzione

La documentazione per PendingIntent.getBroadcast() dice:

  

Restituisce

     

Restituisce un PendingIntent esistente o nuova corrispondenti ai parametri indicati.

Il problema è che due Intenti differiscono solo per extra sembrano corrispondere a tale scopo. Così getBroadcast() tornerà qualche vecchia PendingIntent a caso (con un EXTRA_ID diverso) al posto di uno nuovo intorno al I intenti appena creato. La correzione è quello di fornire un dato Uri e renderlo differiscono con l'id, in questo modo:

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

È quindi possibile recuperare il numero id utilizzando:

Long.parseLong(intent.getData().getSchemeSpecificPart());

... o, naturalmente, fornire extra come bene e usare quella.

Altri suggerimenti

È anche possibile utilizzare il PendingIntent.FLAG_UPDATE_CURRENT bandiera

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

questo dovrebbe il lavoro troppo

La soluzione per il vostro problema è l'uso Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top