BroadcastReceiver Starten bei einer bestimmten Zeit?

  • Antworten:12
  • Bentwortet
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 17:59:03 via Website

Hallo liebes Forum.

Ich möchte gerne meinen BroadcastReceiver alle 24h Starten lassen.
Das Problem ist nur das es "nicht immer" funktioniert.
Wie ich gelesen habe sollte man es per AlarmManager machen.
So habe ich es auch.

Siehe Code:
1public class Test extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5
6 Intent testIntent = new Intent(context, Test.class);
7 PendingIntent pending = PendingIntent.getBroadcast(context, 0, testIntent, 0);
8 AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
9 Calendar calendar = Calendar.getInstance();
10 calendar.setTimeInMillis(System.currentTimeMillis());
11 calendar.add(Calendar.HOUR,24);
12 alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 0, pending);
13
14 }
15}

Gibt es noch eine bessere oder andere Möglichkeit?
Oder muss ich echt einen WakeLock hinzufügen um das
wirklich am leben zu erhalten?


LG

Antworten
impjor
  • Forum-Beiträge: 1.793

06.10.2013, 18:25:05 via App

Was möchtest du denn alle 24h ausführen? Eventuell gibt es eine einfachere Art, als einen Broadcastreceiver.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 18:27:18 via Website

Möchte nur meinen int Wert um +1 steigern.
Also nichts großes.

Ist ja für meine Widget App.
Nur klappt irgendwie nicht auf jedem Handy so.

Eine einfachere Art wäre toll.


LG

— geändert am 06.10.2013, 18:29:52

Antworten
impjor
  • Forum-Beiträge: 1.793

06.10.2013, 18:37:00 via App

Speichere doch deinen int-Wert in einem SharedPreferences und zusätzlich die Zeit. Dann prüft dein Widget ob die Zeit+24h überschritten ist, erhöht den int-Wert und erhöht die Zeit um 24h.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 18:41:56 via Website

Hallo.

Den int-Wert speichere ich ja schon in einen SharedPreferences.
Nur wie soll meine Widget die Zeit prüfen?
In einem Service extra?

Die Zeit kann ich ja mit Time/Calendar holen und dann
wieder mit SharedPreferences speichern.


LG

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 19:23:15 via Website

Ich hatte es mal versucht mit einem Service und
while schleife.

Er führt so lange die schleife aus bis es die Zeit erreicht ist.
Ist die Zeit erreicht kommt dann +1 und die while schleife wird wieder Neu gestartet.
Aber frisst glaube massig Batterie weil es immer Arbeitet.


LG

Antworten
impjor
  • Forum-Beiträge: 1.793

06.10.2013, 20:50:12 via Website

Ich weiß ja nicht, wie genau es sein muss, aber würde es nicht reichen, die "Sind 24h Stunden überschritten"-Frage nur im BroadcastReceiver zu machen, den du in deiner Widget-XML als APPWIDGET_UPDATE registriert hast?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 21:36:03 via Website

Hallo impjor.

Danke nochmal für deine Hilfe und Tipps.
Registriert ist er nur normal und nicht im APPWIDGET_UPDATE wie ich das verstehe.
Oder wie kann ich den in der Widget.xml registrieren?

1<receiver android:name=".Test" >
2 <intent-filter>
3 </intent-filter>
4 </receiver>

Benutzt den "APPWIDGET_UPDATE" bereich garnicht.
Sondern nur "APPWIDGET_ENABLED".

Sobald also die Widget auf dem Homescreen gezogen wird
startet "onEnabled".
So wird dann auch der BroadcastReceiver gestartet.
1Intent broad = new Intent(context, Test.class);
2 context.sendBroadcast(broad);

Klar würde das reichen mit dem 24h Stunden darüber.
Aber ich weiß nicht wie ich das umsetzen soll.
Ich habe das nur so versucht das, wenn die Widget gestartet wird,
das er sich merkt welche Uhrzeit das war.
Z.B 12:13:50 uhr.

Dann prüft oder läuft die while schleife so lange bis er die Uhrzeit
hat. Dann wird +1 gemacht.


LG

— geändert am 06.10.2013, 22:15:00

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 22:22:08 via Website

Ach impjor...

Du hast mich da auf eine Idee gebracht glaube ich.
Der APPWIDGET_UPDATE also onUpdate bereich von der Widget
kann sich nach Wunsch bestimmter Zeit selbst Updaten.

Die Zeit setzt man mit:
1android:updatePeriodMillis="">
in der xml.

Da könnte ich 24h dann eintragen.
So würde alle 24h onUpdate upgedatet/gestartet und könnte +1 geben.
Nur was alles in onUpdate ist wird geupdatet.
Nicht der onEnabled wo der BroadcastReceiver gestartet wird.
Sonst würde alle 24h der BroadcastReceiver gestartet und der Rest was in onEnabled drin ist.

Also könnte ich den BroadcastReceiver löschen.
Bräuchte den eigentlich dann nicht mehr.

Das wäre eine Idee denke ich. Oder?


LG

— geändert am 06.10.2013, 22:40:08

Antworten
Michele
  • Forum-Beiträge: 1.525

06.10.2013, 23:15:44 via Website

Ok danke dir sehr.

Ich werde es gleich mal versuchen.


LG

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

07.10.2013, 02:30:56 via Website

Klingt soweit als brauchbare lösung. Wenn Ich das richtig verstehe startet der Widget ja letztendlich einen Service um Daten zu holen ?

Ich würde einen https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html benutzen um einen Receiver samt Wakelock zu benutzen. Du musst lediglich #startWakefulService aufrufen um den Service im Background die gewünschte Zeit am laufen zu haben.
Am Ende oder bei jedem Fehler im Service musst du auf jeden Fall #completeWakefulIntent mit dem Intent aufrufen um den Wakelock zu lösen. Das funktioniert bestens...

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

07.10.2013, 04:33:33 via Website

Hallo Mac.

Danke dir.
Werde mich das auch mal in ruhe angucken.

LG

Antworten