Broadcast Receiver beendet beim Bildschirmauschalten

  • Antworten:18
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 66

13.09.2010, 14:55:20 via Website

Hallo

Also ich hab folgendes Problem. Mein Programm besitzt einen Broadcast receiver der sich beim Systemboot einschaltet und SMS senden soll.
Jetzt ist aber das Problem das sich der Prozess irgendwie beim auschalten des Bildschirms auch abschaltet. Kann man das irgendwie umgehen?

bin für jede hilfe dankbar

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.09.2010, 11:15:22 via Website

Wie machst du das denn ? Code ?

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

14.09.2010, 11:28:17 via Website

Im Endeffekt sag ich im Android Manifest das ein Broadcast receiver starten soll, wenn das system gebootet wurde. Dieser Broadcast receiver startet
einen Thread (SMS Versand)

So funktioniert auch alles Perfekt. Das komische ist, dass wenn das handy grad am aufladen ist, kann ich den bildschirm auschalten und es funktioniert immernoch, nur wenn ich ohne stromanschluss den bildschirm auschalte, funktioniert es nichtmehr.

Hier mal mein Quellcode. Ich dachte das es mit dem IntentFilter SCREEN_OFF funktioniert, aber das tut es nicht.

Manifest

1<receiver android:name="SmsReceiver" >
2 <intent-filter android:priority="100">
3 <action android:name="android.intent.action.BOOT_COMPLETED" />
4 <category android:name="android.intent.category.HOME" />
5 </intent-filter>
6
7 <intent-filter>
8 <action android:name="android.intent.action.SCREEN_ON"></action>
9 </intent-filter>
10
11 </receiver>


Broadcast Receiver

1package picoguard.view;
2
3import java.text.ParseException;
4import java.text.SimpleDateFormat;
5import java.util.Date;
6
7import picoguard.database.AnlagenTabelle;
8import picoguard.database.PicoguardDatenbank;
9import picoguard.database.UhrzeitTabelle;
10import android.content.BroadcastReceiver;
11import android.content.Context;
12import android.content.Intent;
13import android.database.Cursor;
14import android.telephony.SmsManager;
15import android.util.Log;
16/**
17 * Diese Klasse dient dazu den Picoguard Zeitplan zu implementieren.
18 * Der Picoguard Zeitplan ermöglicht es dem Benutzer gewissen Uhrzeiten
19 * und Wochentage einzustellen an denen seine Alarmanlagen entweder
20 * scharf oder unscharf geschalten werden soll. Diese Funktionalität
21 * wird durch diesen SmsReceiver bereitgestellt. Dieser schaltet sich
22 * automatisch nach anschalten des Mobiltelefons ein und überprüft
23 * jede Minute ob ein Termin "ansteht".
24 *
25 * @author stefanbaumgartner
26 *
27 */
28public class SmsReceiver extends BroadcastReceiver implements Runnable {
29
30 /*
31 * Spaltenamen der Zeitplan Tabelle.
32 */
33 private static final String[] SUCHE = new String[] {
34 UhrzeitTabelle.ID,
35 UhrzeitTabelle.UHRZEIT,
36 UhrzeitTabelle.MONTAG,
37 UhrzeitTabelle.DIENSTAG,
38 UhrzeitTabelle.MITTWOCH,
39 UhrzeitTabelle.DONNERSTAG,
40 UhrzeitTabelle.FREITAG,
41 UhrzeitTabelle.SAMSTAG,
42 UhrzeitTabelle.SONNTAG,
43 UhrzeitTabelle.ART,
44 UhrzeitTabelle.PICOGUARD
45 };
46 /*
47 * Spaltenamen der Picoguard Tabelle.
48 */
49 private static final String[] SUCHE_PICOGUARD = new String[] {
50 AnlagenTabelle.ID,
51 AnlagenTabelle.NAME,
52 AnlagenTabelle.VERTRAGSNUMMER,
53 AnlagenTabelle.RUFNUMMER,
54 AnlagenTabelle.PINSCHARF,
55 AnlagenTabelle.PINUNSCHARF,
56 };
57 //Datenbank
58 private volatile PicoguardDatenbank picoguardDatenbank;
59 /**
60 * Diese Methode wird nach anschalten des Handys aufgerufen.
61 *
62 * @param context
63 * @param intent
64 */
65 @Override
66 public void onReceive(Context context, Intent intent) {
67
68 try {
69 //Datenbank wird erstellt.
70 picoguardDatenbank = new PicoguardDatenbank(context);
71 //Thread wird gestart. Dieser lauscht auf anstehende Termine.
72 Thread t = new Thread(this);
73 t.start();
74 }
75 catch (Exception ex) {
76 Log.e("ALARM_RECEIVER", ex.toString());
77 }
78 }
79 /**
80 * Run Methode des Threads.
81 */
82 @Override
83 public void run() {
84
85 while(true) {
86 /*
87 * Mit diesen Cursor erhalten wir alle Datensätze der
88 * Zeitplan Tabelle.
89 */
90 Cursor smsCursor = picoguardDatenbank.getReadableDatabase().query(
91 UhrzeitTabelle.TABELLEN_NAME, SUCHE, null, null,
92 null, null, null);
93 /*
94 * Diese For schleife wird eingesetzt um durch alle
95 * Datensätze durchzuschalten.
96 */
97 for(int count = 1; count <= smsCursor.getCount(); count++) {
98 //Zeiger auf den nächsten Datensatz
99 smsCursor.moveToNext();
100 /*
101 * Werte für den aktuellen Datensatz werden aus der
102 * Datenbank geholt.
103 */
104 String uhrzeit = smsCursor.getString(1);
105 Boolean montag = Boolean.parseBoolean(smsCursor.getString(2));
106 Boolean dienstag = Boolean.parseBoolean(smsCursor.getString(3));
107 Boolean mittwoch = Boolean.parseBoolean(smsCursor.getString(4));
108 Boolean donnerstag = Boolean.parseBoolean(smsCursor.getString(5));
109 Boolean freitag = Boolean.parseBoolean(smsCursor.getString(6));
110 Boolean samstag = Boolean.parseBoolean(smsCursor.getString(7));
111 Boolean sonntag = Boolean.parseBoolean(smsCursor.getString(8));
112 String art = smsCursor.getString(9);
113 int picoguard = smsCursor.getInt(10);
114 /*
115 * Die Uhrzeit (aus der Datenbank) wird in das richtige
116 * Format übertragen. Also im Stunden-Minuten Format
117 */
118 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
119 Date gespeicherteZeit = null;
120 try {
121 gespeicherteZeit = sdf.parse(uhrzeit);
122 }
123 catch (ParseException e) {
124 e.printStackTrace();
125 }
126 //Aktuelle Systemzeit.
127 Date aktuelleZeit = new Date();
128 /*
129 * Um Beide Zeiten (Systemzeit und Gespeicherte Zeit)
130 * vergleichen zu können, werden sie in Minuten umgerechnet.
131 */
132 int aktuellMinuten = aktuelleZeit.getHours() * 60 + aktuelleZeit.getMinutes();
133 int gespeichertMinuten = gespeicherteZeit.getHours() * 60 + gespeicherteZeit.getMinutes();
134 /*
135 * Wenn die Systemzeit gleich der gespeicherten Zeit ist.
136 */
137 if(aktuellMinuten == gespeichertMinuten) {
138 /*
139 * Von dem aktuellen Zeitplan datensatz wird der
140 * dazugehörige Picoguard Datensatz geholt.
141 */
142 Cursor picoguardCursor = picoguardDatenbank.getReadableDatabase().query(
143 AnlagenTabelle.TABELLEN_NAME, SUCHE_PICOGUARD,
144 "_id = ?", new String[] {String.valueOf(picoguard)}, null, null, null);
145
146 picoguardCursor.move(1);
147 //SmsManger zum versand von SMS
148 SmsManager smsManager = SmsManager.getDefault();
149
150 /*
151 * Abfrage ob der Tag stimmt. Wenn ja, dann soll
152 * die SMS gesendet werden.
153 */
154 if(montag == true && aktuelleZeit.getDay() == 1) {
155 if(art.equals("Scharf")) {
156 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
157 picoguardCursor.getString(4), null, null);
158 }
159 else if(art.equals("Unscharf")) {
160 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
161 picoguardCursor.getString(5), null, null);
162 }
163 }
164 else if(dienstag == true && aktuelleZeit.getDay() == 2) {
165 if(art.equals("Scharf")) {
166 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
167 picoguardCursor.getString(4), null, null);
168 }
169 else if(art.equals("Unscharf")) {
170 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
171 picoguardCursor.getString(5), null, null);
172 }
173 }
174 else if(mittwoch == true && aktuelleZeit.getDay() == 3) {
175 if(art.equals("Scharf")) {
176 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
177 picoguardCursor.getString(4), null, null);
178 }
179 else if(art.equals("Unscharf")) {
180 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
181 picoguardCursor.getString(5), null, null);
182 }
183 }
184 else if(donnerstag == true && aktuelleZeit.getDay() == 4) {
185 if(art.equals("Scharf")) {
186 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
187 picoguardCursor.getString(4), null, null);
188 }
189 else if(art.equals("Unscharf")) {
190 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
191 picoguardCursor.getString(5), null, null);
192 }
193 }
194 else if(freitag == true && aktuelleZeit.getDay() == 5) {
195 if(art.equals("Scharf")) {
196 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
197 picoguardCursor.getString(4), null, null);
198 }
199 else if(art.equals("Unscharf")) {
200 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
201 picoguardCursor.getString(5), null, null);
202 }
203 }
204 else if(samstag == true && aktuelleZeit.getDay() == 6) {
205 if(art.equals("Scharf")) {
206 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
207 picoguardCursor.getString(4), null, null);
208 }
209 else if(art.equals("Unscharf")) {
210 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
211 picoguardCursor.getString(5), null, null);
212 }
213 }
214 else if(sonntag == true && aktuelleZeit.getDay() == 0) {
215 if(art.equals("Scharf")) {
216 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
217 picoguardCursor.getString(4), null, null);
218 }
219 else if(art.equals("Unscharf")) {
220 smsManager.sendTextMessage(picoguardCursor.getString(3), null,
221 picoguardCursor.getString(5), null, null);
222 }
223 }
224 }
225 }
226 /*
227 * Thread legt sich eine Minute "schlafen"
228 */
229 try {
230 Thread.sleep(60000);
231 }
232 catch (InterruptedException e) {
233 }
234 }
235 }
236}

Antworten
Lars K.
  • Forum-Beiträge: 274

14.09.2010, 12:41:10 via Website

Hallo.

Ich habe mir jetzt nicht die Mühe gemacht deinen Code komplett zu lesen, aber eine Frage die sich mir direkt aufdrängt habe ich dann schon ;)
Warum ein Thread?

Wenn ich es richtig verstehe soll dein Programm zu verschiedenen Zeiten eine SMS schicken. Ein permanent laufender Thread ist komplett untauglich für mobile Endgeräte (Akku Leistung). Wenn ich Recht habe werden deine User keinen Spaß mit so einer App haben.
Android optimiert beim Ausschalten des Displays dein Speicher usw. Da dein Thread kein Teil eines Services sondern eine Activity und diese Activity nun nicht mehr im Vordergrund ist (sondern der LockScreen), wird es wahrscheinlich mit gestoppt.

Der Android Ansatz ist da ein Wenig anders. Schau dir mal den AlarmManager an. Der ist genau für solche Anwendungsfälle gedacht.
Beim Starten deiner App berechnest du den nächsten Zeitpunkt an dem eine SMS geschickt werden muss und setzt entsprechend den AlarmManager. Deine App muss dann nicht mehr im Hintergrund aktiv sein sondern kann beendet werden.
Sowie der Zeitpunkt erreicht ist wird der AlarmManager den Intend aufrufen den du ihm beim setzten des Alarms mitgegeben hast.

Da du wahrscheinlich nicht umgedingt willst das in so einem Moment deine Activity wieder in den Vordergrund kommt, solltest du hier über einen Service nachdenken.

Bye
Lars

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.09.2010, 12:44:10 via Website

Tja, das kann nicht funtzen. Ein BroadcastReciever darf max 5-10 sekunden "leben". Da du hier Runnable Implementierst ist das wohl der Grund dafür das
Android den Reciever "killt" Ich würde versuchen das Runnable wo anders zu implementieren.

Mein vorredner hat ebenfalls recht, "Aktiv schlafen" ist unter Android nicht das was man machen sollte. Das beste ist eine Methode im Service bereit zu stellen der erledigt was lange dauert.

— geändert am 14.09.2010, 12:52:48

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

15.09.2010, 09:52:46 via Website

danke für die antworten

Ich versuche grad eure ideen umzusetzten aber ich hänge grad.

Ich will es jetzt so machen, dass beim booten ein broadcastReceiver gestartet wird. Dieser kuggt in der Datenbank die zeitpläne (für die sms´s)
nach und startet dementsprechend einen AlarmManager. Der AlarmManager soll einen service starten der dann die sms verschickt.
(stimmt mein ansatz?)

Bloß ich häng grad schon beim starten eines AlarmManagers :(

Das steht jetzt in der onReceive Methode vom BroadcastReceiver

1PendingIntent sender = PendingIntent.getService(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
2 AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
3 am.set(AlarmManager.RTC_WAKEUP, (gespeichertMinuten*60000) - (aktuellMinuten*60000), sender);

gespeicherteMinuten (sind aus der Datenbank)
aktuellMinuten(aktuelle Zeit)

— geändert am 15.09.2010, 09:53:38

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

15.09.2010, 10:35:21 via Website

Ich poste dir mal meinen Code, Alert ist ne Klasse die einen Alarm darstellt, der Code ist das innere einer schleife die über Alert iteriert:
1final Alert alert = alertsToEnqueue.get(i);
2 final Intent intent = new Intent(_context, AlarmBroadcastReciever.class);
3 intent.setAction("de.deine.action");
4 //
5 final PendingIntent pendingIntent = PendingIntent.getBroadcast(_context, alert.getAlertID(), intent, 0);
6
7 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
8 NORMAL_INTERVAL, pendingIntent);

hth,
Mac

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

15.09.2010, 11:36:07 via Website

danke

hab deinen code noch nicht ausprobiert, aber eine grundsätzliche frage

wie mach ich dann, dass der service sich bei ausgeschalteten bildschirm nicht schließt?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

15.09.2010, 19:01:33 via Website

Services werden nicht "geschlossen". Das ist eigentlich der Sinn hinter einem Service! Steht auch in jedem Android Buch nochmals nachzulesen.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

16.09.2010, 10:12:37 via Website

ok ich probiere es gerade mit dem AlarmManager. Aber hier haben sich 2 fragen aufgedrängt.

1. Wie kann ich einen Alarm planen, der z.B. am Montag um 08:00 losgehen soll? um 08:00 krieg ich hin, bloß das "Montag" nicht.

2. Bei mir schaut der Alarm so aus.

1PendingIntent pendingIntent = PendingIntent.getService(this, 0, new Intent(this, SmsService.class), 0);
2 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
3 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (gespeichertMinuten*60000 - aktuellMinuten*60000), pendingIntent);

Da ist aber das Problem das bei jedem neustart des programmes der abgelaufene alarm wieder aufgerufen wird. Wie stelle ich das ab?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

16.09.2010, 10:53:46 via Website

Zuerstmal steht das meiste in der API Doc zum AlarmManager.
Alarme haben eine ID diese musst du kennen um diese löschen zu können, wie/wo du dir die merkst ist deine Sache.

Java bietet klassen wie Calendar bzw. GregorianCalendar oder man nutzt das Joda Projekt.


hth,
Mac

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

16.09.2010, 16:42:30 via Website

so langsam komm ich auf den richtigen weg (danke an euch alle ;))

bloß jetzt hab ich wieder an problem :(

Das mit dem Alarm klappt soweit alles (also der Service wird gestartet). Jetzt ist aber mein problem das ich den Service eigentlich datenübergeben will (damit er die sms schreiben kann, also z.B. rufnummer). Aber wenn ich das über intent.putExtras() mach (wie bei einer activity) krieg ich nur null-werte

weis einer an was das liegen könnte?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

16.09.2010, 17:47:30 via Website

Aus dem Bauch raus nicht,

Ich mach das folgendermaßen aus dem BroadcastReciever :

1private static void handleAlert(final Context _context, final Alert _alert)
2 {
3 final Intent startServiceIntent = new Intent();
4 Alert.write(_alert, startServiceIntent);
5 startServiceIntent.setAction("de.deine.action");
6 final ComponentName name = _context.startService(startServiceIntent);
7 if (name == null)
8 {
9 Log.e(LOG_TAG, "Failed to start Service.");
10 }
11 }

Das selbst geschriebene Serialisieren des Objekts Alert:
1/**
2 * Writes all info needed to recreate an alert from an intent (Serialize).
3 *
4 * @param _alert
5 * @param _intent
6 * @throws NullPointerException
7 * @see {@link #read(Intent)}
8 */
9 public static void write(final Alert _alert, final Intent _intent) throws NullPointerException
10 {
11 if (_intent == null)
12 {
13 throw new NullPointerException("intent");
14 }
15 if (_alert == null)
16 {
17 throw new NullPointerException("alert");
18 }
19 _intent.putExtra(SPOTNAME, _alert.getSpotName());
20 _intent.putExtra(REPEAT_ID, _alert.getAlertID());
21 _intent.putExtra(RETRYS, _alert.getRetryCounter());
22 _intent.putExtra(SELECTED_ID, _alert.getSelectedID());
23 _intent.putExtra(TIME, _alert.getTime());
24 _intent.putExtra(WEEKDAY, _alert.getDayOfWeek());
25 }

Alert "serialisiert" sich in den Intent, diesen übergebe Ich dem Service, in der Service#onStart Methode bekommst du entsprechend den Intent aus wieder,
hier prüfe Ich auch auf andere Fälle die die #onStart aufrufen.


1@Override
2 // TODO Deprecated from Android >= 2.0
3 public void onStart(final Intent _intent, final int _startId)
4 {
5 super.onStart(_intent, _startId);
6 createTaskQueue();
7 if (Logging.isEnabled)
8 {
9 Log.i(LOG_TAG, "onStart");
10 }
11 /**
12 * Check if we invoked because of an Reboot or Update (market or
13 * install)
14 */
15 if (SpotService.isRestartActiveSpotsIntent(_intent))
16 {
17 addTask(new EnqueueActiveSpots(this));
18 }
19 else if (Alert.isAlertIntent(_intent))
20 {
21 final Alert alert = Alert.read(_intent);
22 createAlarmTask(alert);
23 }




hth,
Mac

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

17.09.2010, 15:55:45 via Website

danke, aber ich hab es jetzt doch anderster hinbekommen (hatte übersehen das man den intent wo man .putExtra() macht dem PendingIntent übergeben muss^^)

Steck bloß jetzt wieder vor einem neuen problem ;(. Und zwar ich frag ja bei start des Handys die Tabelle ab und setze meine AlarmManager.
Aber mein Problem ist grad das ich Tage nur abfrage und nicht setzte.

1if(montag && aktuelleZeit.getDay() == 1) {
2 am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
3 }

Also hab ich mir überlegt (noch nicht getestet), das der zeitplan eigentlich nicht funktionieren dürfte wenn ich z.B. den Alarm auf den nächsten tag sätze und am nächsten tag das handy nicht neustarten würde. oder?

ich hoff ich habs klar ausgedrückt, aber ich müsste im alarm nichtnur die millisekunden sondern auch die Wochentage übergeben können. Aber wie?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.09.2010, 16:16:50 via Website

Der User muss momentan also sein Mobile am Montag hochfahren ?

Du musst das unabhängig davon berechnen, die System#currentTimeMills liefern dir die Aktuelle Zeit des Mobiles. Daraus lässt sich mit den Calender Klassen wenn auch etwas umständlich die Zeit berechnen bis der Alarm ausgelöst werden soll.

Die Alarm API bietet meines Wissen nichts wie: Alarm am Montag, um 14 Uhr

hth,
Mac

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

Antworten
Lars K.
  • Forum-Beiträge: 274

17.09.2010, 16:46:49 via Website

Hallo.

Wenn ich mich recht erinnere, dann übergibt man dem AlarmManager doch einen Zeitpunkt in der Zukunft (in Form der Anzahl an Millisekunden).
Somit ist es doch völlig unerheblich wann dieser Zeitpunkt ist und wann das Handy gestartet wird.
Du solltest einfach sicherstellen das der AlarmManager durch deine Anwendung und durch das Booten plausible gefüttert wird. Du setzt also nur den nächsten Zeitpunkt in dem der Service aktiv werden soll. Dieser Zeitpunkt kann nach einer Sekunde oder nach 10 Jahren erreicht sein... das ist für deine App und den AlarmManager total unerheblich.

Bye
Lars

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

20.09.2010, 10:48:00 via Website

danke ;)

Also ich versuchs jetzt so zu implementieren das ich am anfang abfrage welcher tag überhaupt "heute" ist und dann immer schaue ob welche Tage der Alarm kommen soll (z.B. montag und mittwoch) und setzte dementsprechend den calendar auf 2 tage später oder so. Und dann wollte ich es noch so machen, das das ganze ein Repeating Alarm ist der jede Woche dann "klingelt". Lieg ich da mit meinem "design" Vorschlag richtig? Ist nämlich ein bischen schwer zu testen ;)

Hier mal der Beispielcode für Montag

1//Wenn heute Montag ist
2if(aktuelleZeit.getDay() == 1) {
3//Wenn der Alarm am Montag losgehen soll
4 if(montag) {
5//Setzte den Alarm und wiederhole ihn jede woche.
6 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
7 }
8 else if(dienstag) {
9//Da ja heute Montag ist, und der Benutzer den Alarm am Dienstag haben will, muss der alarm einen tag später geschickt werden.
10 calendar.add(Calendar.DAY_OF_WEEK, 1);
11 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
12 }
13 else if(mittwoch) {
14 calendar.add(Calendar.DAY_OF_WEEK, 2);
15 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
16 }
17 else if(donnerstag) {
18 calendar.add(Calendar.DAY_OF_WEEK, 3);
19 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
20 }
21 else if(freitag) {
22 calendar.add(Calendar.DAY_OF_WEEK, 4);
23 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
24 }
25 else if(samstag) {
26 calendar.add(Calendar.DAY_OF_WEEK, 5);
27 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
28 }
29 else if(sonntag) {
30 calendar.add(Calendar.DAY_OF_WEEK, 6);
31 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 604800000, pendingIntent);
32 }
33 }

kann da jemand vllt. rüberkuggen und feedback geben?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

20.09.2010, 12:44:40 via Website

Mann könnte das ganze auch ohne Montag - So If/else leiter schreiben, da du momentan einfach den nächsten Tag als Alarm einträgst. Was ist aber wenn der User
den Alarm um 10:00 Uhr haben will statt zu dem Zeitpunkt am nächsten Tag als das Tel. gebootet wurde ?

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 66

20.09.2010, 15:00:32 via Website

könntest du das im code zeigen?

das mit dem 10:00 wird schon geregelt (das ist leider in meinem code abschnitt nicht drinnen)

vorher mach ich noch

1calendar.add(Calendar.MINUTE, gespeichertMinuten - aktuellMinuten);

gespeichertMinuten = was der benutzer eingetragen hat

edit:

Habs jetzt hinbekommen, zwar sind in meinem oberen code noch Fehler, aber von der idee her hats so geklappt.

— geändert am 24.09.2010, 09:44:34

Antworten