“BroadcastReceiver.onReceive()” wird doppelt aufgerufen

  • Antworten:10
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 10:31:11 via Website

Hi an alle. Ich hätte hier ein kleines Problemchen und kann es nicht lösen. Vielleicht habt ihr ja eine Idee...würde mich sehr freuen^^.

Und zwar:

Ich habe eine kleine App, in der ich eine SwitchPreference zum aktivieren von automatischen Updates verwende. Darunter habe ich einen TimePicker eingebaut, in der man die Uhrzeit des automatischen Updates angeben kann. Wenn die Updates aktiviert sind und die Zeit erreicht ist, wird im Hintergrund eine Datei gedownloaded.

So weit so gut. Bisher klappt alles.

Jetzt zum eigentlichen Problem:

Wenn ich jetzt die Updates aktiviere setze ich in meiner BroadcastReceiver Klasse einen Alarm. Wenn ich die Uhrzeit ändere, wird der Alarm gelöscht und ein neuer Alarm mit der neuen Uhrzeit gesetzt. Bei jedem Alarm-setzen wird bei mir die "onReceive" Methode aufgerufen. Wenn die gewünschte Uhrzeit erreicht wird, wird die onReceive-Methode wieder aufgerufen (So soll es ja auch sein).

Da ich in der onReceive-Methode den Download ausführen will benötige ich den Aufruf für die onReceive-Methode also nur zu dem Zeitpunkt des Erreichens der Uhrzeit und nicht schon wenn ich die Uhrzeit setze.

Gibt es eine Möglichkeit dies abzufragen? Bzw onReceive nur aufzurufen wenn die Uhrzeit erreicht ist?

Ich hoffe Ihr habt eine Idee wie ich das Problem lösen kann.

Aller liebste Grüße, Robin.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.03.2014, 10:35:36 via Website

Google Play macht doch Updates automatisch, da musst du doch keine Update Funktion einbauen oder lädst du die Datei von extern?

sinnvoller ist es 2 broadcast Receiver zu nehmen, einer wenn die zeit gesetzt wird und einer wenn die Zeit abgelaufen ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 10:40:11 via Website

Hi, danke erstmal für die schnelle Antwort.

Ich glaube du hast das ein bisschen falsch verstanden.

Ich mache mit den "automatischen Updates" kein Update von dem Programm, sondern lade eine externe Datei (pdf) herunter.

Ich habe das nur "automatische Updates" genannt, weil es nur die pdf updatet.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.03.2014, 10:57:15 via Website

Achso und wieso muss der User eine Uhrzeit angeben wann die Datei heruntergeladen wird?
Mach doch einfach nen UpdateButton hin und lasse den User selbst entscheiden wann er ein Update haben will

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 11:00:18 via Website

So würde mein BroadcastReceiver aussehen:

1public class AlarmManagerBroadcastReceiver extends BroadcastReceiver{
2
3 final public static String ONE_TIME = "onetime";
4 long intervall = 1000 * 60 * 60 * 24;
5
6 @Override
7 public void onReceive(Context context, Intent intent) {
8 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
9 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MY TAG");
10 wl.acquire();
11
12 Toast.makeText(context, "Download wird ausgeführt", Toast.LENGTH_LONG).show();
13
14 wl.release();
15 }
16
17 public void setAlarm(Context context, long timeValue)
18 {
19 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
20 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
21 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
22 am.setRepeating(AlarmManager.RTC_WAKEUP, timeValue, intervall, pi);
23 }
24
25 public void cancelAlarm(Context context)
26 {
27 Toast.makeText(context, "automatische Updates deaktiviert", Toast.LENGTH_SHORT).show();
28 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
29 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
30 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
31 alarmManager.cancel(sender);
32 }
33}

Die onReceive Methode wird wie gesagt beim setzen des Alarms aufgerufen und wenn der Alarm erreicht ist. Soll aber nur wenn der Alarm erreicht ist aufgerufen werden.

Antworten
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 11:02:20 via Website

Das habe ich ja schon drinnen^^

Wollte halt als Zusatz, dass der Kram auch automatisch runter geladen wird.

Und es funktioniert soweit auch. Außer dass der Download eben doppelt aufgerufen wird.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.03.2014, 11:04:08 via Website

Dann setz doch in den SharedPrefs das letzt downloaddatum und zeit. Und nach einer bestimmten Zeitspanne zb. 1h kann sie wieder runtergeldaden werden.
Oder du überprüfst das dateierstelldatum.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 11:05:38 via Website

Jooo, das klingt auf jeden Fall nach einem Plan.

Ich werd das so versuchen...Super. Dank dir.:grin:

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.03.2014, 11:06:45 via Website

Kein Problem :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Robin Robinson
  • Forum-Beiträge: 6

03.03.2014, 11:13:40 via Website

Njaaa...ich glaub das löst aber trotzdem nicht so richtig mein Problem...

Wenn ich jetzt zB. die autoUpdates aktiviere...wird ja sofort die onReceive Methode aufgerufen und die Datei gedownloaded. und wenn ich 11:30 Uhr Als Uhrzeit eingestellt habe, dann wird 11:30 Uhr die PDF nochmal runter geladen. Es soll ja nicht gleich beim aktivieren der Updates bzw beim bestätigen der gewünschten Uhrzeit runter geladen werden, sondern nur wenn die Zeit erreicht ist.

...bitter...

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.03.2014, 11:26:01 via App

Dann setzt du beim setzen des timers ne boolean variable in der on recive fragst du diese ab und dann hast du kein problem mehr

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten