Mehrere Anrufe zu AlarmManager.setRepeating liefern die gleichen Intent / PendingIntent zusätzliche Werte, aber ich geliefert unterschiedliche

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

Frage

Gelöst während dieser Frage zu schreiben, aber veröffentlichen, falls es hilft jemand:

Ich gründe mehrere Alarme wie diese, mit unterschiedlichen Werten von 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

... und sie wie folgt empfangen:

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

Der Alarm wird zur richtigen Zeit an meinen Receiver geliefert, aber oft mit EXTRA_ID Satz auf den falschen Wert: es ist ein Wert, den ich irgendwann benutzt habe, nur nicht das, die ich zu diesem bestimmten Zeitpunkt geliefert wollte <. / p>

War es hilfreich?

Lösung

Die Dokumentation für PendingIntent.getBroadcast() sagt:

  

Returns

     

Gibt einen bestehenden oder neuen PendingIntent den angegebenen Parametern entsprechen.

Das Problem ist, dass zwei unterschiedliche Intents nur in Extras scheinen für diesen Zweck zu entsprechen. So getBroadcast() wird einige zufällige alte PendingIntent zurückkehren (mit einem anderen EXTRA_ID) statt einen neuen um die Absicht Ich habe gerade. Die Lösung ist eine Daten Uri zu liefern und machen es unterscheiden sich mit der ID, wie folgt aus:

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

Sie können dann rufen Sie die ID-Nummer mit:

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

... oder natürlich die extra als auch liefern und verwendet diesen.

Andere Tipps

Sie können auch die Flagge PendingIntent.FLAG_UPDATE_CURRENT verwenden

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

Dies sollte die Arbeit zu

Die Lösung für Ihr Problem ist die Verwendung Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top