2016-06-01 10 views
3

Ich habe 2 BroadcastReceivers und 2 Absichten, ich möchte eine Schaltfläche klicken, später 5m starten Broadcast1 und 10m später broadcast2 beginnen, was passiert ist, dass sie beide 10m starten, nachdem ich auf, meine Vermutung ist, die Absichten sind nicht einzigartig, aber ich setze für jeden einen unterschiedlichen reqeustCode.Sonderbare Alarmmanager Verhalten

Knopf OnClick:

Bundle bd = new Bundle(); 
    bd.putInt("mInt", i); 

    Intent intent1 = new Intent(getActivity(), Broadcast_1.class); 
    intent1.putExtras(bd); 
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i, intent1, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager1 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmManager1.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*5, 1000*60*10, pendingIntent1); 
    Toast.makeText(getActivity(), "countdown started "+i ,Toast.LENGTH_SHORT).show(); 

    Intent intent2 = new Intent(getActivity(), Broadcast_1.class); 
    intent2.putExtras(bd); 
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i+42212342, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager2 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmManager2.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*10, 1000*60*10, pendingIntent2); 

BroadcastReceiver_1 und _2 (sie sehen gleich aus) Klasse:

public class Broadcast_1 extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Calendar c = Calendar.getInstance(); 
     int seconds = c.get(Calendar.SECOND); 
     int minutes = c.get(Calendar.MINUTE); 
     ShowTextFragment.setText("Broadcast_1" + " at " + minutes + " : " + seconds); 

    } 

} 

Frage: Warum die jüngste Absicht drücken Sie den vorherigen Absichten zu seiner Startzeit?

bestätigte ich dieses Verhalten durch den Zeitdruck, wenn der Code ausgeführt wird Broadcast. Bitte helfen

Antwort

1

Das Problem, das Sie sehen, ist So wie das repeating alarms now work. Um die Batterie zu schonen, nimmt die AlarmManager jetzt große Freiheiten in Alarmen, um Gruppe mehr Alarme zusammen Umschuldung. Grundsätzlich, wenn Sie irgendeine Art von genauem Timing benötigen, sollten Sie vergessen, setRepeating() zu verwenden. Verwenden Sie stattdessen setExact(). Wenn Sie einen wiederholten Alarm benötigen, setzen Sie ihn einfach zurück, wenn er sich löst.

+0

Wie nahe müssen die Alarme sein, damit Android sie gruppiert?Ich teste das mit einer kurzen Zeit, aber ich möchte es tatsächlich mit täglichen oder wöchentlichen Intervallen verwenden. –

+0

Ich weiß es nicht und du solltest dich nicht darauf verlassen, wenn du etwas genaues Timing brauchst. Dies ist alles anbieterspezifisch, so dass Sie möglicherweise feststellen, dass das Verhalten/Timing auf einem Samsung-Gerät anders ist als auf einem HTC- oder LG-Gerät (zum Beispiel). –

+0

Gut, aber ich möchte nicht unnötig das Benutzerabwehrsystem entleeren, es wird so viele Alarme geben wie Ereignisse, die der Benutzer hinzufügt, also kann es eine Menge sein, hast du eine kleine Vorstellung davon, wie viel Zeit es für sie ist Gruppe? –

0

Der Grund dafür ist, dass die Absichten nicht individuell sind. Sie werden wiederverwendet, wenn die Daten das gleiches sind (wie in Ihrem Fall)

Vom doc:

Ein häufigen Fehler machen Menschen ist es, mehr PendingIntent Objekte mit Intents zu erstellen, die nur in ihrem „extra“ variieren Inhalt, erwartet jedes Mal einen anderen PendingIntent. Das passiert nicht. Die Teile der Absicht, die für den Abgleich verwendet werden, sind dieselben, die von Intent.filterEquals definiert sind. Wenn Sie zwei Intent-Objekte verwenden, die äquivalent nach Intent.filterEquals sind, erhalten Sie für beide den gleichen PendingIntent.

+0

Die zusätzlichen Daten ändern nicht die Absicht, es wird immer noch das gleiche sein – Erich

+0

Ja, ich habe es falsch gelesen, wie kann ich sie unterscheiden? –

+0

Ich habe diese Antwort gefunden, indem ich zufällig Fragen durchsucht habe und sie beantwortet einen Fehler, den ich seit Wochen habe! Ich denke, wir müssen eine Unterklasse der Absicht mit überschriebenen FilterEquals erstellen, nicht wahr? –

-1

Es scheint, wie die requestCode Feld in Ihrem getBroadcast Anruf nicht immer machen es einzigartig. Siehe den zweiten Kommentar zu dieser Frage: What's "requestCode" used for on PendingIntent?

Da den „extra“ Inhalt sie nicht unterscheiden entweder jemand festgestellt, dass auf dem Intent unterschiedliche Dateneinstellung gearbeitet: https://stackoverflow.com/a/33203752/508608

+0

Es funktioniert nicht tho –

+0

Unterschiedliche Anforderungscodes machen die 'PendingIntent' einzigartig. –