Plusieurs appels à AlarmManager.setRepeating livrer les mêmes intentions / PendingIntent valeurs supplémentaires, mais je fournis différents les

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

Question

Résolu en écrivant cette question, mais l'affichage dans le cas où il aide tout le monde:

J'installe plusieurs alarmes comme celle-ci, avec des valeurs différentes de 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

... et les recevoir comme ceci:

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'alarme est livré à mon récepteur au bon moment, mais souvent avec EXTRA_ID ensemble à la valeur erronée: il est une valeur que je l'ai utilisé à un moment donné, mais pas celui que je voulais prononcé à ce moment-là <. / p>

Était-ce utile?

La solution

La documentation PendingIntent.getBroadcast() dit:

  

retour

     

Retourne un correspondant PendingIntent existant ou nouveau les paramètres donnés.

Le problème est que deux Intentions ne diffèrent que par extras semblent correspondre à cette fin. Alors getBroadcast() retournera un vieux PendingIntent aléatoire (avec un autre EXTRA_ID) au lieu d'un nouveau autour de l'intention que je vous venez de créer. Le correctif est de fournir une donnée Uri et le faire diffèrent avec l'identifiant, comme ceci:

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

Vous pouvez ensuite récupérer le numéro d'identification à l'aide:

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

... ou de l'offre bien sûr extra aussi bien et utiliser.

Autres conseils

Vous pouvez également utiliser le drapeau PendingIntent.FLAG_UPDATE_CURRENT

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

si le travail trop

La solution à votre problème est l'utilisation Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top