2 verschiedene Alarmmanager aber ein BroadcastReceiver

  • Antworten:31
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 98

05.12.2013 00:24:00 via Website

Hallo Forum,
ich habe folgendes Problem bzw. würde ich gerne folgendes bewerkstelligen.

Im Moment kann der User mittels Buttons auswählen, wann ein Alarm losgehen soll ( alle 15 Minuten, 30, etc. ).
Ein Broadcastreceiver reagiert darauf und verschickt dann eine SMS.

Jetzt möchte ich aber, dass der User sowohl den Button 15 und 30 betätigen kann.
Das Ergebnis soll dann sein: dass nach 15 Minuten eine SMS verschickt wird und nach 30 Minuten.

Mein Problem, sofern ich es richtig verstehe liegt aber nun darin, dass mein SmsManager in der onReceive Methode vom BroadcastReceiver sich befindet und sofort auf beide Alarmmanager reagiert und somit 2 SMS verschickt werden.

Vll. kann mir jemand einen guten Tipp geben, wie ich es bewerkstelligen kann, dass der Alarmmanager alle 15 Minuten eine SMS mit dem Text 15 Minuten versendet und alle 30 Minuten eine SMS mit einem anderen Text verschickt?

Meine Activityklasse ( kurz umrissen ):

1public void addListenerOnButton() {
2 button1 = (Button) findViewById(R.id.button1);
3 button2 = (Button) findViewById(R.id.button2);
4 button3 = (Button) findViewById(R.id.button3);
5 button4 = (Button) findViewById(R.id.button4);
6 button5 = (Button) findViewById(R.id.button5);
7
8 button1.setOnClickListener(new OnClickListener() {
9 public void onClick(View arg0) {
10 np.clearFocus();
11 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
12 SharedPreferences.Editor editor = prefs.edit();
13 editor.putString("a", Integer.toString(15));
14 editor.commit();
15 if ( np.getValue() == 1)
16 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
17 else if (np.getValue() == 0)
18 Toast.makeText(getBaseContext(), "15 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
19 else
20 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
21
22 alarm.SetAlarm(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
23 button2.setEnabled(false);
24 button3.setEnabled(false);
25 button4.setEnabled(false);
26 button5.setEnabled(false);
27 }
28 });

Die BroadcastReceiver - Klasse:

1public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
2
3 final public String ONE_TIME = "onetime";
4 final public String SECOND = "second";
5 SharedPreferences sp, kennzeichen, telefonnummer;
6 Editor e;
7
8 @Override
9 public void onReceive(Context context, Intent intent) {
10 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
11 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
12 //Acquire the lock
13 wl.acquire();
14
15 /* zeitbuchung */
16 sp = context.getSharedPreferences("a", 0);
17 String value = sp.getString("a", "");
18
19 /* kenzeichen */
20 kennzeichen = context.getSharedPreferences("kennzeichen", 1);
21 String valueKennzeichen = kennzeichen.getString("kennzeichen", "");
22
23 /* Telefonnummer */
24 telefonnummer = context.getSharedPreferences("handyparken", 1);
25 String valueTelefonnummer = telefonnummer.getString("handyparken", "");
26
27 SmsManager smsManager = SmsManager.getDefault();
28 //smsManager.sendTextMessage("082820200", null, "test", null, null);
29 smsManager.sendTextMessage(valueTelefonnummer, null, value + " Wien*" + valueKennzeichen, null, null);
30
31 //Release the lock
32 wl.release();
33 }
34 public void SetAlarm(Context context, long timer, int hour, int minute){
35 if(timer != 0){//set repeating timer
36 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
37 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
38 intent.putExtra(ONE_TIME, "a");
39 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
40 //when to start
41 Calendar timeOff9 = Calendar.getInstance();
42 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
43 timeOff9.set(Calendar.MINUTE, minute);
44 //when to start
45 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), timer*60000, pi);
46 }else{//one timer
47 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
48 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
49 intent.putExtra(SECOND, "b");
50 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
51 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
52 }
53 }
54 public void CancelAlarm(Context context)
55 {
56 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
57 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
58 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
59 alarmManager.cancel(sender);
60 }
61}

Danke Euch für jede Hilfe schon einmal!
  • Forum-Beiträge: 1.525

05.12.2013 12:02:22 via Website

Hallo.

Irgendwie verstehe ich dein Sinn nicht.

Soll er nun Automatisch alle 15min und 30min eine SMS verschicken oder
soll der User per Button alle 15min oder alle 30min anklicken/aussuchen können?

Beschreibe es bitte nochmal deutlicher.

Denn hier steht es einmal so:
1Das Ergebnis soll dann sein: dass nach 15 Minuten eine SMS verschickt wird und nach 30 Minuten.
Und dann doch wieder so:
1Jetzt möchte ich aber, dass der User sowohl den Button 15 und 30 betätigen kann.


LG

— geändert am 05.12.2013 12:02:52

  • Forum-Beiträge: 98

05.12.2013 14:25:44 via Website

Ok, sorry, dachte mir beim Schreiben schon, dass es ziemlich schlecht ausgedrückt ist.

Ich möchte folgendes bewerkstelligen,
dass eine SMS verschickt wird ( alle 15 oder alle 30 Minuten ) habe ich bewerkstelligen können, jedoch hätte ich gerne 2 laufende AlarmManager, zumindest denke ich, dass ich 2 brauchen werde.

Es sollte auf einer Zeitachse so aussehen:

09:02: SMS mit dem Text 15
09:17: SMS mit dem Text 30
09:47: SMS mit dem Text 15
10:02 SMS mit dem Text 30
10:32: ....

Danke vielmals schon für jede Hilfe!
  • Forum-Beiträge: 1.525

05.12.2013 14:32:42 via Website

Hallo.

Was mir nun auf die schnelle einfallen würde ist,

etwa du machst 2 AlarmManager´s und einem BroadCastReceiver und das dazu was @impjor schon sagte.

Oder umständlicher mit 2 AlarmManager´s und 2 BroadCastReceiver´s.


LG
  • Forum-Beiträge: 98

05.12.2013 14:39:43 via Website

Kann ich damit auch verhindern, dass der BroadcastReceiver gleichzeitig auf beide AlarmManager hört?
Bis jetzt hatte ich das Problem, dass zwar 2 AlarmManager getriggert wurden, aber der BroadcastReceiver beide gleichzeitig "gehört" hat.
  • Forum-Beiträge: 98

05.12.2013 14:40:46 via Website

Ich denke ich werde es einmal mit der umständlichen Version versuchen, weil die straitforwarded ist, für mich zumindest :)
Danke Dir vielmals!
  • Forum-Beiträge: 1.525

05.12.2013 14:42:58 via Website

Hallo.

Das umständlichere ist aber nicht so toll und hilft dir auch nicht weiter was das lernen angeht.

Mach das was @impjor gesagt hat.

Wenn es nicht klappt, dann frag uns nochmal lieber hier nach, warum etc.

EDIT: Was mir noch einfällt ist. Du kannst auch
1intent.setAction(STRING15MIN);
benutzen.

Und dann im BroadcastReceiver das was auf 15min angesprochen werden soll, so machen:

1if(intent.getAction().equals(STRING15MIN)){
2
3
4}

Und so machst du das dann auch mit 30min.


LG

— geändert am 05.12.2013 14:57:05

  • Forum-Beiträge: 98

05.12.2013 14:53:02 via Website

Da gebe ich Dir natürlich vollkommen recht, mein Problem ist aber im Moment, dass ich absolut nicht weiss, wohin ich die beiden AlarmManager gebe.
Im Moment befindet sich der AlarmManager in einer Methode SetAlarm in der abgeleiteten BroadcastReceiver - Klasse und die onReceive Methode verschickt dann die SMS.

Die Activity - Klasse beherbergt die Buttons und Textfields, trägt also nicht viel zum Geschehen bei.
  • Forum-Beiträge: 98

05.12.2013 15:04:21 via Website

Sorry, war wirklich blöd von mir.
Habe es gelesen und nicht mein Gehirn eingeschalten :)

Dann werde ich es versuchen, wie Du es vorschlägst.

Danke Dir vielmals!
  • Forum-Beiträge: 98

05.12.2013 20:44:20 via Website

Hallo,
ich habe genau das versucht, was ihr mir geraten habt, leider jedoch ist das Ergebnis wieder negativ verlaufen.

Ich habe in der onReceive Methode die if - Abfrage eingebaut.
Zudem habe ich 2 SetAlarm - Methode erschaffen, damit nicht beide AlarmManager in ein und derselben Methode sich befinden und beide sofort getriggert werden.

Leider jedoch werden immer 2 SMS verschickt und ich komme nicht dahinter.

So sieht mein Code aus:

1public void SetAlarm(Context context, long timer, int hour, int minute){
2 if(timer != 0){//set repeating timer
3 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
4 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
5 intent.putExtra(ONE_TIME, "a");
6 intent.setAction(ONE_TIME);
7 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
8 //when to start
9 Calendar timeOff9 = Calendar.getInstance();
10 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
11 timeOff9.set(Calendar.MINUTE, minute);
12 //when to start
13 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), timer*60000, pi);
14 }else{//one timer
15 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
16 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
17 intent.putExtra(SECOND, "b");
18 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
19 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
20 }
21 }
22 public void SetAlarm1(Context context, long timer, int hour, int minute){
23 if(timer != 0){//set repeating timer
24 AlarmManager am1=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
25 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
26 intent1.putExtra(SECOND_TIME, "aa");
27 intent1.setAction(SECOND_TIME);
28 PendingIntent pi1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
29 //when to start
30 Calendar timeOff9 = Calendar.getInstance();
31 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
32 timeOff9.set(Calendar.MINUTE, minute);
33 //when to start
34 am1.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), timer*60000, pi1);
35 }else{//one timer
36 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
37 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
38 intent.putExtra(SECOND, "b");
39 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
40 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
41 }
42 }

Meine onReceive Methode vom BroadcastReceiver

1public void onReceive(Context context, Intent intent) {
2 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
3 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
4 //Acquire the lock
5 wl.acquire();
6
7 /* zeitbuchung */
8 sp = context.getSharedPreferences("a", 0);
9 String value = sp.getString("a", "");
10
11 /* kenzeichen */
12 kennzeichen = context.getSharedPreferences("kennzeichen", 1);
13 String valueKennzeichen = kennzeichen.getString("kennzeichen", "");
14
15 /* Telefonnummer */
16 telefonnummer = context.getSharedPreferences("handyparken", 1);
17 String valueTelefonnummer = telefonnummer.getString("handyparken", "");
18
19 if(intent.getAction().equals(ONE_TIME)){
20 SmsManager smsManager = SmsManager.getDefault();
21 //smsManager.sendTextMessage("082820200", null, "test", null, null);
22 //smsManager.sendTextMessage(valueTelefonnummer, null, value + " Wien*" + valueKennzeichen, null, null);
23 smsManager.sendTextMessage("06763506625", null, "test", null, null);
24 } else {
25 SmsManager smsManager = SmsManager.getDefault();
26 //smsManager.sendTextMessage("082820200", null, "test", null, null);
27 //smsManager.sendTextMessage(valueTelefonnummer, null, value + " Wien*" + valueKennzeichen, null, null);
28 smsManager.sendTextMessage("06763506625", null, "test", null, null);
29 }
30
31 //Release the lock
32 wl.release();
33 }
  • Forum-Beiträge: 98

05.12.2013 21:11:50 via Website

Ich antworte mir mal selber; es funktioniert doch - muss nur schauen, wie ich beide AlarmManager stoppen kann, weil sie einfach weiterlaufen.

So sieht mein Code für das stoppen der AlarmManager aus, für 2 AlarmManager funkt es jedoch leider noch nicht!

1public void CancelAlarm(Context context)
2 {
3 for(int i = 0; i<3; i++){
4 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
5 PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, 0);
6 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
7 alarmManager.cancel(sender);
8 }
9 }
  • Forum-Beiträge: 1.525

05.12.2013 21:20:30 via Website

Hallo.

Etwa putExtra oder setAction/getAction.
Nicht beides.

Was ist daran so schwer?

BroadcastReceiver würde dann so aussehen:

1public void onReceive(Context context, Intent intent) {
2
3 if(intent.getAction().equals(ONE_SMS)){
4
5
6 } else if(intent.getAction().equals(TWO_SMS)){
7
8
9 }
Und die Intent vom AlarmManager so:
1intent.setAction(ONE_SMS);
2intent.setAction(TWO_SMS);
Jede Intent ist einmal ein AlarmManager.



LG

— geändert am 05.12.2013 21:25:26

  • Forum-Beiträge: 98

05.12.2013 21:31:34 via Website

Hallo,
danke Dir vielmals für Deine Hilfe.

Ich habe es mit 2 SetAlarm Methoden geloest.
In jeder Methode ich einen AlarmManager definiert mit einem eindeutigen Integer - Identifier für den AlarmManager.

Das Einzige, das noch nicht hinhaut ist, dass sich beide AlarmManager stoppen lassen, obwohl ich es bereits über die Integer - Identifier versucht habe!

Vll. kannst Du mir hierbei auch nochmals helfen?

Danke vielmals!

1public void CancelAlarm(Context context)
2 {
3 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
4 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
5 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
6 alarmManager.cancel(sender);
7
8 // zweiter AlarmManager
9 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
10 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
11 AlarmManager alarmManager1 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
12 alarmManager1.cancel(sender1);
13 }

— geändert am 05.12.2013 23:13:46

  • Forum-Beiträge: 98

06.12.2013 17:36:47 via Website

Hallo,
danke Dir für Deine gestrige Hilfe.
Beide AlarmManager laufen nun, wie ich es mir vorgestellt habe, jedoch lassen sie sich nun nicht mehr stoppen.

Zuvor, wo ich nur einen verwendet habe, hat es immer funktioniert, aber nachdem jetzt beide laufen, lässt sich keiner mehr stoppen.

Obwohl ich eine unique ID für beide AlarmManager verwende, funktioniert die cancel Methode nicht mehr!

Ich denke es hängt mit der neuen Funktion setAction zusammen, jedoch weiss ich nicht, wie ich die beiden AlarmManager wieder stoppen kann,

Kannst Du mir vll. einmal noch helfen?

Danke Dir vielmals!
  • Forum-Beiträge: 1.525

06.12.2013 19:14:43 via Website

Hallo.

Würde dir gerne helfen.
Bis heute konnte ich meine auch nicht stoppen.

Obwohl ich es auch richtig gemacht habe etc, lassen die sich nicht stoppen.



LG
  • Forum-Beiträge: 98

06.12.2013 19:45:12 via Website

Hallo,
dann geht es Dir also genauso.

Einfach seltsam.

Wenn man beide AlarmManager in nur eine SetAlarm Methode gibt ( somit werden beide gleichzeitig getriggert, was zwar nicht gewünscht ist, aber zumindest ein Test ), dann lassen sie sich stoppen, aber wenn man beide AlarmManager aufteilt auf 2 SetAlarm Methoden (SetAlarm und SetAlarm1) dann funktioniert es nicht mehr.

Äußerst seltsam und ich dachte mir schon, ich bin einfach nur unfähig.

Trotzdem danke Dir schon vielmals, vll. finden wir ja etwas!
  • Forum-Beiträge: 98

06.12.2013 22:21:41 via Website

Ich habe einen Versuch mit 2 Klassen, die die Klasse BroadcastReceiver ableiten, ausgeführt.

Hat aber leider auch nicht funktioniert ( oder ich mache es falsch )