2010-05-16 2 views
17

gelöst, während diese Frage zu schreiben, aber im Fall der Veröffentlichung hilft es jemand:Mehr Anrufe zu AlarmManager.setRepeating liefern das gleiche Intent/PendingIntent zusätzliche Werte, aber ich geliefert unterschiedliche

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 an meinen Receiver ein ausgeliefert t die richtigen Zeiten, aber oft mit EXTRA_ID auf den falschen Wert eingestellt: Es ist ein Wert, den ich irgendwann verwendet habe, nur nicht die, die ich zu dieser bestimmten Zeit geliefert werden wollte.

Antwort

24

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

Returns

Gibt einen bestehenden oder neuen PendingIntent den angegebenen Parametern entsprechen.

Das Problem ist, dass zwei Intents, die sich nur in Extras unterscheiden, für diesen Zweck übereinstimmen. So getBroadcast() wird einige zufällige alte PendingIntent (mit einer anderen EXTRA_ID) statt einer neuen um die Absicht, die ich gerade erstellt. Die Lösung ist eine Daten Uri liefern und es mit der ID unterscheiden machen, wie folgt aus:

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

Anschließend können Sie die ID-Nummer abrufen mit: die

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

... oder natürlich liefern extra auch und benutze das.

+0

Nur frage mich, wenn ich ein neu Absicht mit Absicht i = neue Absicht (Kontext, Cls); Habe ich dieses gemischte ID-Problem? In meinem Fall ist das Cls für verschiedene Alarme unterschiedlich. Es sollte in Ordnung sein, oder? – Safecoder

+0

Ich kann derzeit nicht den genauen Ort finden, an dem ich vorher geschaut habe, um den Punkt über Extras zu sehen, aber ja, mit einer anderen Klasse ist es eine völlig andere Absicht, also würde ich sehr erwarten, dass das funktioniert. –

+1

@ChrisBoyle, Vielen Dank. Aber in meinem Fall funktioniert es nicht. Dies funktioniert jedoch folgendermaßen: 'Intent intent = new Intent (null, Uri.parse (Long.toString (id)), Kontext, AlarmActivity.class);'. Beachten Sie, dass ich Aktivität verwenden kann. –

7

könnten Sie auch die Fahne verwenden PendingIntent.FLAG_UPDATE_CURRENT

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

dies sollte das Werk zu

+0

Wenn Sie es nur einmal verwenden würden, dann ja, aber für einen Alarm mit mehreren Timern benötigen Sie mehrere PendingIntents, um gleichzeitig gültig zu sein, und FLAG_UPDATE_CURRENT würde Sie mit allen Alarmen senden, die den neuesten Intent senden. –

2

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

p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK); 
Verwandte Themen