2 verschiedene Alarmmanager aber ein BroadcastReceiver

  • Antworten:31
Bernd Roth
  • 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!

Antworten
Michele
  • 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

Antworten
Bernd Roth
  • 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!

Antworten
Michele
  • 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

Antworten
Bernd Roth
  • 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.

Antworten
Bernd Roth
  • 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!

Antworten
Michele
  • 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

Antworten
Bernd Roth
  • 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.

Antworten
Michele
  • Forum-Beiträge: 1.525

05.12.2013, 14:57:51 via Website

Lese mal mein EDIT von eben :D

Und bisschen Googlen solltest du schon.



LG

Bernd Roth

Antworten
Bernd Roth
  • 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!

Antworten
Bernd Roth
  • 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 }

Antworten
Bernd Roth
  • 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 }

Antworten
Michele
  • 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

Bernd Roth

Antworten
Bernd Roth
  • 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

Antworten
Bernd Roth
  • 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!

Antworten
Michele
  • 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

Antworten
Bernd Roth
  • 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!

Antworten
impjor
  • Forum-Beiträge: 1.793

06.12.2013, 20:11:22 via Website

Kann es sein, dass du erst noch die Actions usw. zu deinem Intent hinzufügen musst, bevor du ihn cancelst?

LG

Liebe Grüße impjor.

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

Antworten
Bernd Roth
  • 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 )

Antworten
Bernd Roth
  • Forum-Beiträge: 98

06.12.2013, 23:07:26 via Website

Hallo,
habe jetzt verschiedene Versuche unternommen, aber leider immer ohne positivem Ergebnis.

1) 2 Klassen mit BroadcastReceiver führte dazu, dass nur ein BroadcastReceiver funktionierte
2) Habe deinen Vorschlag hoffentlich richtig umgesetzt:

Dabei hat es sich ergeben, dass der erste AlarmManager überschrieben wurde.

Ich schicke hier einmal meine ganzen Code, da ich jetzt ehrlich nicht mehr weiter weiss:

In der MainActivity werden Button1 u Button2 die Ergebnisse mittels SharedPreferences gesetzt, die ich dann im BroadcastReceiver auffange.

MainActivity:

1package at.parken.parken;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.content.Context;
6import android.content.Intent;
7import android.content.SharedPreferences;
8import android.view.Menu;
9import android.view.MenuInflater;
10import android.view.MenuItem;
11import android.view.View;
12import android.view.View.OnClickListener;
13import android.widget.Button;
14import android.widget.NumberPicker;
15import android.widget.TimePicker;
16import android.widget.Toast;
17import at.parken.parken.R;
18
19public class AlarmManagerActivity extends Activity {
20
21 private AlarmManagerBroadcastReceiver alarm;
22 Button button1, button2, button3, button4, button5;
23 NumberPicker np;
24 TimePicker tp;
25 int hour, minute;
26 int counter;
27
28 @Override
29 public void onCreate(Bundle savedInstanceState) {
30 super.onCreate(savedInstanceState);
31 setContentView(R.layout.activity_alarm_manager);
32 alarm = new AlarmManagerBroadcastReceiver();
33 tp = new TimePicker(getBaseContext());
34 addListenerOnButton();
35 tp = (TimePicker)findViewById(R.id.timePicker1);
36 tp.clearFocus();
37 np = (NumberPicker) findViewById(R.id.numberPicker1);
38 np.setMinValue(0);
39 np.setMaxValue(1440);
40 np.setWrapSelectorWheel(true);
41 np.setValue(1);
42 }
43
44 public void addListenerOnButton() {
45 button1 = (Button) findViewById(R.id.button1);
46 button2 = (Button) findViewById(R.id.button2);
47 button3 = (Button) findViewById(R.id.button3);
48 button4 = (Button) findViewById(R.id.button4);
49 button5 = (Button) findViewById(R.id.button5);
50
51 button1.setOnClickListener(new OnClickListener() {
52 public void onClick(View arg0) {
53 np.clearFocus();
54 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
55 SharedPreferences.Editor editor = prefs.edit();
56 editor.putString("a", Integer.toString(15));
57 editor.commit();
58 if ( np.getValue() == 1)
59 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
60 else if (np.getValue() == 0)
61 Toast.makeText(getBaseContext(), "15 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
62 else
63 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
64 alarm.SetAlarm(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
65 counter+=1;
66 if(counter == 2){
67 button1.setEnabled(false);
68 button2.setEnabled(false);
69 button3.setEnabled(false);
70 button4.setEnabled(false);
71 button5.setEnabled(false);
72 }
73 }
74 });
75
76 button2.setOnClickListener(new OnClickListener() {
77 public void onClick(View arg0) {
78 np.clearFocus();
79 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
80 SharedPreferences.Editor editor = prefs.edit();
81 editor.putString("a", Integer.toString(30));
82 editor.commit();
83 if ( np.getValue() == 1)
84 Toast.makeText(getBaseContext(), "30 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
85 else if (np.getValue() == 0)
86 Toast.makeText(getBaseContext(), "30 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
87 else
88 Toast.makeText(getBaseContext(), "30 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
89 alarm.SetAlarm1(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
90 counter+=1;
91 if(counter == 2){
92 button1.setEnabled(false);
93 button2.setEnabled(false);
94 button3.setEnabled(false);
95 button4.setEnabled(false);
96 button5.setEnabled(false);
97 }
98 }
99 });
100
101 button3.setOnClickListener(new OnClickListener() {
102 public void onClick(View arg0) {
103 np.clearFocus();
104 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
105 SharedPreferences.Editor editor = prefs.edit();
106 editor.putString("a", Integer.toString(60));
107 editor.commit();
108 if ( np.getValue() == 1)
109 Toast.makeText(getBaseContext(), "60 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
110 else if (np.getValue() == 0)
111 Toast.makeText(getBaseContext(), "60 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
112 else
113 Toast.makeText(getBaseContext(), "60 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
114 alarm.SetAlarm(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
115 button1.setEnabled(false);
116 button2.setEnabled(false);
117 button3.setEnabled(false);
118 button4.setEnabled(false);
119 button5.setEnabled(false);
120 }
121 });
122
123 button4.setOnClickListener(new OnClickListener() {
124 public void onClick(View arg0) {
125 np.clearFocus();
126 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
127 SharedPreferences.Editor editor = prefs.edit();
128 editor.putString("a", Integer.toString(90));
129 editor.commit();
130 if ( np.getValue() == 1)
131 Toast.makeText(getBaseContext(), "120 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
132 else if (np.getValue() == 0)
133 Toast.makeText(getBaseContext(), "120 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
134 else
135 Toast.makeText(getBaseContext(), "120 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
136 alarm.SetAlarm(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
137 button1.setEnabled(false);
138 button2.setEnabled(false);
139 button3.setEnabled(false);
140 button4.setEnabled(false);
141 button5.setEnabled(false);
142 }
143 });
144
145 button5.setOnClickListener(new OnClickListener() {
146 public void onClick(View arg0) {
147 np.clearFocus();
148 SharedPreferences prefs = getSharedPreferences("a", MODE_PRIVATE);
149 SharedPreferences.Editor editor = prefs.edit();
150 editor.putString("a", Integer.toString(120));
151 editor.commit();
152 if ( np.getValue() == 1)
153 Toast.makeText(getBaseContext(), "180 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
154 else if (np.getValue() == 0)
155 Toast.makeText(getBaseContext(), "180 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
156 else
157 Toast.makeText(getBaseContext(), "180 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
158 alarm.SetAlarm(getApplicationContext(), np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
159 button1.setEnabled(false);
160 button2.setEnabled(false);
161 button3.setEnabled(false);
162 button4.setEnabled(false);
163 button5.setEnabled(false);
164 }
165 });
166 }
167
168 @Override
169 protected void onStart() {
170 super.onStart();
171 }
172
173 public void startRepeatingTimer(View view) {
174 Context context = this.getApplicationContext();
175 if(alarm != null){
176 alarm.CancelAlarm(context);
177 button1.setEnabled(true);
178 button2.setEnabled(true);
179 button3.setEnabled(true);
180 button4.setEnabled(true);
181 button5.setEnabled(true);
182 Toast.makeText(context, "Wiederholung wurde gestoppt!", Toast.LENGTH_SHORT).show();
183 }else{
184 Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
185 }
186 }
187/*
188 public void cancelRepeatingTimer(View view){
189 Context context = this.getApplicationContext();
190 if(alarm != null){
191 alarm.CancelAlarm(context);
192 }else{
193 Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
194 }
195 }
196 */
197/*
198 public void onetimeTimer(View view){
199 Context context = this.getApplicationContext();
200 if(alarm != null){
201 alarm.setOnetimeTimer(context);
202 }else{
203 Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
204 }
205 }
206*/
207 @Override
208 public boolean onCreateOptionsMenu(Menu menu){
209 super.onCreateOptionsMenu(menu);
210 MenuInflater inflater = getMenuInflater();
211 inflater.inflate(R.menu.activity_main_actions, menu);
212 return super.onCreateOptionsMenu(menu);
213 }
214
215 @Override
216 public boolean onOptionsItemSelected(MenuItem item){
217 switch (item.getItemId())
218 {
219 case R.id.osm:
220 Toast.makeText(AlarmManagerActivity.this, "OpenStreetMap fuer Parkzonen wird geoeffnet; bitte Internetverbindung einschalten", Toast.LENGTH_LONG).show();
221 Intent myIntent = new Intent(AlarmManagerActivity.this, WebViewActivity.class);
222 startActivity(myIntent);
223 return true;
224 case R.id.parkguthaben:
225 Toast.makeText(AlarmManagerActivity.this, "Parkguthaben wird geoeffnet", Toast.LENGTH_LONG).show();
226 Intent myIntent1 = new Intent(AlarmManagerActivity.this, Parkkonto.class);
227 startActivity(myIntent1);
228 return true;
229 default:
230 return super.onOptionsItemSelected(item);
231 }
232 }
233}

BroadcastReceiver

1package at.parken.parken;
2
3import java.util.Calendar;
4import android.app.AlarmManager;
5import android.app.PendingIntent;
6import android.content.BroadcastReceiver;
7import android.content.Context;
8import android.content.Intent;
9import android.content.SharedPreferences;
10import android.content.SharedPreferences.Editor;
11import android.os.PowerManager;
12import android.telephony.SmsManager;
13import android.widget.Toast;
14
15public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
16
17 final public String ONE_TIME = "onetime";
18 final public String SECOND_TIME = "secondtime";
19 final public String SECOND = "second";
20 SharedPreferences sp, sp1, kennzeichen, telefonnummer;
21 Editor e;
22 int counter = 0;
23
24 @Override
25 public void onReceive(Context context, Intent intent) {
26 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
27 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
28 //Acquire the lock
29 wl.acquire();
30
31 /* zeitbuchung */
32 sp = context.getSharedPreferences("a", 0);
33 String value = sp.getString("a", "");
34
35 sp1 = context.getSharedPreferences("b", 0);
36 String value1 = sp.getString("b", "");
37
38 /* kenzeichen */
39 kennzeichen = context.getSharedPreferences("kennzeichen", 1);
40 String valueKennzeichen = kennzeichen.getString("kennzeichen", "");
41
42 /* Telefonnummer */
43 telefonnummer = context.getSharedPreferences("handyparken", 1);
44
45 String valueTelefonnummer = telefonnummer.getString("handyparken", "");
46 SmsManager smsManager = SmsManager.getDefault();
47 //smsManager.sendTextMessage(valueTelefonnummer, null, value1 + " Wien*" + valueKennzeichen, null, null);
48 smsManager.sendTextMessage("xxx", null, value + value1, null, null);
49 //Release the lock
50 wl.release();
51 }
52 public void SetAlarm(Context context, long timer, int hour, int minute){
53 if(timer != 0){//set repeating timer
54 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
55 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
56 intent.putExtra(ONE_TIME, Boolean.FALSE);
57 intent.setAction("SetAlarm");
58 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
59 //when to start
60 Calendar timeOff9 = Calendar.getInstance();
61 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
62 timeOff9.set(Calendar.MINUTE, minute);
63 //when to start
64 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 1*6000, pi);
65 }else{//one timer
66 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
67 intent.putExtra(ONE_TIME, Boolean.FALSE);
68 intent.setAction("SetAlarm");
69 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
70 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
71 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
72 }
73 }
74 public void SetAlarm1(Context context, long timer, int hour, int minute){
75 if(timer != 0){//set repeating timer
76 AlarmManager am1=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
77 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
78 intent1.putExtra(SECOND_TIME, Boolean.FALSE);
79 intent1.setAction("SetAlarm1");
80 PendingIntent pi1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
81 //when to start
82 Calendar timeOff9 = Calendar.getInstance();
83 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
84 timeOff9.set(Calendar.MINUTE, minute);
85 //when to start
86 am1.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 2*6000, pi1);
87 }else{//one timer
88 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
89 intent1.putExtra(SECOND_TIME, Boolean.FALSE);
90 intent1.setAction("SetAlarm1");
91 AlarmManager am1=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
92 PendingIntent pi1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
93 am1.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi1);
94 }
95 }
96 public void CancelAlarm(Context context)
97 {
98 // first alarm
99 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
100 intent.setAction("SetAlarm");
101 Toast.makeText(context, "Erster Alarm wird gestoppt", Toast.LENGTH_LONG).show();
102 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
103 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
104 alarmManager.cancel(sender);
105
106 // second alarm
107 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
108 intent1.setAction("SetAlarm1");
109 Toast.makeText(context, "Zweiter Alarm wird gestoppt", Toast.LENGTH_LONG).show();
110 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
111 AlarmManager alarmManager1 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
112 alarmManager1.cancel(sender1);
113 }
114}

Vll. hat ja jemand noch eine Idee.

Danke vielmals!

Antworten
impjor
  • Forum-Beiträge: 1.793

06.12.2013, 23:23:47 via App

Du könntest das ganze bitte etwas übersichtlicher gestalten! Z.B., wo ist der Unterschied zwischen setAlarm und setAlarm1? Funktionen bitte immer kleinGroß schreiben (setAlarm statt SetAlarm), ebenso Variabeln.
Dann nicht eine Funktion in zwei Teile durch ein if spalten, die bis auf eine Zeile das selbe tun!

Dann beschreibe bitte nocheinmal dein Problem: Was soll passieren und was passiert? Du sagst was von überschreiben, dann soll was gecancelt werden, ich steige irgendwie nicht mehr durch.

Gibt es Fehler im Log?

LG

Liebe Grüße impjor.

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

Antworten
Michele
  • Forum-Beiträge: 1.525

06.12.2013, 23:56:46 via Website

Da kann ich @impjor nur recht geben.

Ich steige da auch nicht mehr durch.
Bisschen sauberer und übersichtlicher wäre gut.

Ein beispiel:
Von dir:
1if(counter == 2){
2 button1.setEnabled(false);
3 button2.setEnabled(false);
4 button3.setEnabled(false);
5 button4.setEnabled(false);
6 button5.setEnabled(false);
7}

Wie ich es machen würde um es übersichtlicher zu behalten:
1if(counter == 2) {
2
3 button1.setEnabled(false);
4 button2.setEnabled(false);
5 button3.setEnabled(false);
6 button4.setEnabled(false);
7 button5.setEnabled(false);
8
9}


LG

— geändert am 06.12.2013, 23:57:59

Antworten
Bernd Roth
  • Forum-Beiträge: 98

06.12.2013, 23:59:54 via Website

Hallo,
bis jetzt war es immer so, dass man genau einen Alarm starten und diesen auch stoppen konnte, das funktionierte auch wunderbar.

Jetzt wollte ich das Ganze so kombinieren, dass man zB: um 09:02 einen Alarm starten kann ( manuell ), der alle 17 Minuten automatisch getriggert wird.
Um 09:17 sollte man einen 2ten Alarm starten können ( manuell ), der sich dann alle 45 Minuten wiederholt.

Der Grund warum ich 2 Methoden habe, die SetAlarm und SetAlarm1 heissen liegt darin, dass das Ganze mit 2 AlarmManager bis jetzt nicht funktioniert hat und ich dachte mir ich teile beides einmal auf und teste weiter.
Jetzt, wenn ich mir den Code natürlich nochmals genauer anschaue, sehe ich auch, dass ich einfach in der SetAlarm - Methode eine if - Abfrage einbauen hätte können und dort die Abfrage auf timer machen hätte können.

Im Moment ist es also so, dass bei den verschiedenen Versuchen sich entweder beide AlarmManager nicht mehr stoppen liessen oder wie im letzten Fall der 2te getriggerte AlarmManager den Ersten überschreibt ( es wird nur mehr der 2te getriggert! ).

Im Moment weiss ich einfach nicht mehr weiter, wie ich einfach 2 AlarmManager zum Laufen bekomme, die zu einem unterschiedlichen Zeitpunkt gestartet werden und wo abhängig der beiden AlarmManager eine unterschiedliche Nachricht verschickt wird, sowie, dass sich beide AlarmManager gleichzeitig stoppen lassen!

Ich hoffe, ich konnte das Problem besser beschreiben jetzt!

Danke Die vielmals schon für Deine Hilfe!

Antworten
Bernd Roth
  • Forum-Beiträge: 98

07.12.2013, 00:33:42 via Website

Hallo,
so, habe den Code nochmals ein wenig aufgeräumt ( Gross, Kleinschreibung im Moment noch nicht, mache ich aber noch, versprochen! ).
Habe die beiden Methoden SetAlarm und SetAlarm1 wieder zu einer zusamengeführt und einen weiteren Parameter übergeben, woran man nun unterscheiden kann, ob es 15 Minuten oder 30 Minuten sein soll!

Bei der MainActivity habe ich die SharedPreferences entfernen können, weil ich die Werte 15, 30, 60, etc als Parameter nun an SetAlarm übergebe.

Bei dieser Version habe ich nun das Problem, dass sich beide AlarmManager nicht mehr stoppen lassen!

Vielen Dank für Eurer beiden Hilfe!

MainActivity:

1package at.parken.parken;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.content.Context;
6import android.content.Intent;
7import android.view.Menu;
8import android.view.MenuInflater;
9import android.view.MenuItem;
10import android.view.View;
11import android.view.View.OnClickListener;
12import android.widget.Button;
13import android.widget.NumberPicker;
14import android.widget.TimePicker;
15import android.widget.Toast;
16import at.parken.parken.R;
17
18public class AlarmManagerActivity extends Activity {
19
20 private AlarmManagerBroadcastReceiver alarm;
21 Button button1, button2, button3, button4, button5;
22 NumberPicker np;
23 TimePicker tp;
24 int hour, minute;
25 int counter;
26
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.activity_alarm_manager);
31 alarm = new AlarmManagerBroadcastReceiver();
32 tp = new TimePicker(getBaseContext());
33 addListenerOnButton();
34 tp = (TimePicker)findViewById(R.id.timePicker1);
35 tp.clearFocus();
36 np = (NumberPicker) findViewById(R.id.numberPicker1);
37 np.setMinValue(0);
38 np.setMaxValue(1440);
39 np.setWrapSelectorWheel(true);
40 np.setValue(1);
41 }
42
43 public void addListenerOnButton() {
44 button1 = (Button) findViewById(R.id.button1);
45 button2 = (Button) findViewById(R.id.button2);
46 button3 = (Button) findViewById(R.id.button3);
47 button4 = (Button) findViewById(R.id.button4);
48 button5 = (Button) findViewById(R.id.button5);
49
50 button1.setOnClickListener(new OnClickListener() {
51 public void onClick(View arg0) {
52 np.clearFocus();
53 if ( np.getValue() == 1)
54 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
55 else if (np.getValue() == 0)
56 Toast.makeText(getBaseContext(), "15 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
57 else
58 Toast.makeText(getBaseContext(), "15 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
59 alarm.SetAlarm(getApplicationContext(), "15", np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
60 counter+=1;
61 if(counter == 2){
62 button1.setEnabled(false);
63 button2.setEnabled(false);
64 button3.setEnabled(false);
65 button4.setEnabled(false);
66 button5.setEnabled(false);
67 }
68 }
69 });
70
71 button2.setOnClickListener(new OnClickListener() {
72 public void onClick(View arg0) {
73 np.clearFocus();
74 if ( np.getValue() == 1)
75 Toast.makeText(getBaseContext(), "30 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
76 else if (np.getValue() == 0)
77 Toast.makeText(getBaseContext(), "30 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
78 else
79 Toast.makeText(getBaseContext(), "30 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
80 alarm.SetAlarm(getApplicationContext(), "30", np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
81 counter+=1;
82 if(counter == 2){
83 button1.setEnabled(false);
84 button2.setEnabled(false);
85 button3.setEnabled(false);
86 button4.setEnabled(false);
87 button5.setEnabled(false);
88 }
89 }
90 });
91
92 button3.setOnClickListener(new OnClickListener() {
93 public void onClick(View arg0) {
94 np.clearFocus();
95 if ( np.getValue() == 1)
96 Toast.makeText(getBaseContext(), "60 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
97 else if (np.getValue() == 0)
98 Toast.makeText(getBaseContext(), "60 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
99 else
100 Toast.makeText(getBaseContext(), "60 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
101 alarm.SetAlarm(getApplicationContext(), "60", np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
102 button1.setEnabled(false);
103 button2.setEnabled(false);
104 button3.setEnabled(false);
105 button4.setEnabled(false);
106 button5.setEnabled(false);
107 }
108 });
109
110 button4.setOnClickListener(new OnClickListener() {
111 public void onClick(View arg0) {
112 np.clearFocus();
113 if ( np.getValue() == 1)
114 Toast.makeText(getBaseContext(), "120 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
115 else if (np.getValue() == 0)
116 Toast.makeText(getBaseContext(), "120 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
117 else
118 Toast.makeText(getBaseContext(), "120 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
119 alarm.SetAlarm(getApplicationContext(), "120", np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
120 button1.setEnabled(false);
121 button2.setEnabled(false);
122 button3.setEnabled(false);
123 button4.setEnabled(false);
124 button5.setEnabled(false);
125 }
126 });
127
128 button5.setOnClickListener(new OnClickListener() {
129 public void onClick(View arg0) {
130 np.clearFocus();
131 if ( np.getValue() == 1)
132 Toast.makeText(getBaseContext(), "180 Minuten mit " + np.getValue() + "ner Minute Intervall sind gebucht", Toast.LENGTH_SHORT).show();
133 else if (np.getValue() == 0)
134 Toast.makeText(getBaseContext(), "180 Minuten sind gebucht", Toast.LENGTH_SHORT).show();
135 else
136 Toast.makeText(getBaseContext(), "180 Minuten mit " + np.getValue() + " Minuten Intervall sind gebucht", Toast.LENGTH_SHORT).show();
137 alarm.SetAlarm(getApplicationContext(), "180", np.getValue(), tp.getCurrentHour(), tp.getCurrentMinute());
138 button1.setEnabled(false);
139 button2.setEnabled(false);
140 button3.setEnabled(false);
141 button4.setEnabled(false);
142 button5.setEnabled(false);
143 }
144 });
145 }
146
147 @Override
148 protected void onStart() {
149 super.onStart();
150 }
151
152 public void cancelRepeatingTimer(View view) {
153 Context context = this.getApplicationContext();
154 if(alarm != null){
155 alarm.CancelAlarm(context);
156 button1.setEnabled(true);
157 button2.setEnabled(true);
158 button3.setEnabled(true);
159 button4.setEnabled(true);
160 button5.setEnabled(true);
161 Toast.makeText(context, "Wiederholung wurde gestoppt!", Toast.LENGTH_SHORT).show();
162 }else{
163 Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();
164 }
165 }
166 @Override
167 public boolean onCreateOptionsMenu(Menu menu){
168 super.onCreateOptionsMenu(menu);
169 MenuInflater inflater = getMenuInflater();
170 inflater.inflate(R.menu.activity_main_actions, menu);
171 return super.onCreateOptionsMenu(menu);
172 }
173
174 @Override
175 public boolean onOptionsItemSelected(MenuItem item){
176 switch (item.getItemId())
177 {
178 case R.id.osm:
179 Toast.makeText(AlarmManagerActivity.this, "OpenStreetMap fuer Parkzonen wird geoeffnet; bitte Internetverbindung einschalten", Toast.LENGTH_LONG).show();
180 Intent myIntent = new Intent(AlarmManagerActivity.this, WebViewActivity.class);
181 startActivity(myIntent);
182 return true;
183 case R.id.parkguthaben:
184 Toast.makeText(AlarmManagerActivity.this, "Parkguthaben wird geoeffnet", Toast.LENGTH_LONG).show();
185 Intent myIntent1 = new Intent(AlarmManagerActivity.this, Parkkonto.class);
186 startActivity(myIntent1);
187 return true;
188 default:
189 return super.onOptionsItemSelected(item);
190 }
191 }
192}

BroadcastReceiver

1package at.parken.parken;
2
3import java.util.Calendar;
4import android.app.AlarmManager;
5import android.app.PendingIntent;
6import android.content.BroadcastReceiver;
7import android.content.Context;
8import android.content.Intent;
9import android.content.SharedPreferences;
10import android.content.SharedPreferences.Editor;
11import android.os.PowerManager;
12import android.telephony.SmsManager;
13import android.widget.Toast;
14
15public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
16
17 final public String ONE_TIME = "onetime";
18 final public String SECOND = "second";
19 SharedPreferences sp, kennzeichen, telefonnummer;
20 Editor e;
21 int counter = 0;
22 String eigeneTelefonnummer = "xxx";
23
24 @Override
25 public void onReceive(Context context, Intent intent) {
26 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
27 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
28 //Acquire the lock
29 wl.acquire();
30
31 /* zeitbuchung */
32 sp = context.getSharedPreferences("a", 0);
33 String value = sp.getString("a", "");
34
35 /* kenzeichen */
36 kennzeichen = context.getSharedPreferences("kennzeichen", 1);
37 String valueKennzeichen = kennzeichen.getString("kennzeichen", "");
38
39 /* Telefonnummer */
40 telefonnummer = context.getSharedPreferences("handyparken", 1);
41 String valueTelefonnummer = telefonnummer.getString("handyparken", "");
42
43 SmsManager smsManager = SmsManager.getDefault();
44
45 if(valueTelefonnummer.length() == 0 || valueKennzeichen.length() == 0)
46 Toast.makeText(context, "Bitte speichern Sie Telefonnummer und Kennzeichen, siehe Menueeinstellungen in der Notificationbar!", Toast.LENGTH_LONG).show();
47 else {
48 if(intent.getAction().equals("15")){
49 smsManager.sendTextMessage(valueTelefonnummer, null, "15" + " Wien*" + valueKennzeichen, null, null);
50 } else if(intent.getAction().equals("30")){
51 smsManager.sendTextMessage(valueTelefonnummer, null, "30" + " Wien*" + valueKennzeichen, null, null);
52 }
53 }
54 //Release the lock
55 wl.release();
56 }
57 public void SetAlarm(Context context, String parkschein, long timer, int hour, int minute){
58 if(timer != 0 && parkschein == "15"){//set repeating timer
59 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
60 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
61 intent.setAction("15");
62 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
63 //when to start
64 Calendar timeOff9 = Calendar.getInstance();
65 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
66 timeOff9.set(Calendar.MINUTE, minute);
67 //when to start
68 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 1*6000, pi);
69 }else if(timer != 0 && parkschein == "30"){
70 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
71 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
72 intent1.setAction("30");
73 PendingIntent pi1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
74 //when to start
75 Calendar timeOff9 = Calendar.getInstance();
76 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
77 timeOff9.set(Calendar.MINUTE, minute);
78 //when to start
79 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 2*6000, pi1);
80 }else{//one timer
81 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
82 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
83 intent.setAction("nur ein test");
84 PendingIntent pi = PendingIntent.getBroadcast(context, 1, intent, 0);
85 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
86 }
87 }
88 public void CancelAlarm(Context context)
89 {
90 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
91 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
92 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
93 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
94 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
95 try{
96 alarmManager.cancel(sender);
97 alarmManager.cancel(sender1);
98 } catch(Exception e) {
99 Toast.makeText(context, "Wiederholung konnte nicht gestoppt werden, bitte Telefon neu starten!", Toast.LENGTH_LONG).show();
100 }
101 }
102}

XML

1<?xml version="1.0" encoding="utf-8"?>
2<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="wrap_content" >
5
6<LinearLayout
7 android:layout_width="match_parent"
8 android:layout_height="match_parent"
9 android:gravity="center"
10 android:orientation="vertical" >
11
12 <TextView
13 android:id="@+id/textView1"
14 android:layout_width="match_parent"
15 android:layout_height="wrap_content"
16 android:text="Uhrzeit"
17 android:textAppearance="?android:attr/textAppearanceSmall" />
18
19 <TimePicker
20 android:id="@+id/timePicker1"
21 android:layout_width="match_parent"
22 android:layout_height="wrap_content" />
23
24 <TextView
25 android:id="@+id/textView3"
26 android:layout_width="wrap_content"
27 android:layout_height="wrap_content"
28 android:text="Intervall in Minuten"
29 android:textAppearance="?android:attr/textAppearanceSmall" />
30
31 <NumberPicker
32 android:id="@+id/numberPicker1"
33 android:layout_width="wrap_content"
34 android:layout_height="116dp" />
35
36 <TextView
37 android:id="@+id/textView2"
38 android:layout_width="match_parent"
39 android:layout_height="wrap_content"
40 android:text="Parkschein bestellen"
41 android:textAppearance="?android:attr/textAppearanceMedium" />
42
43 <RelativeLayout
44 android:layout_width="match_parent"
45 android:layout_height="wrap_content" >
46
47 <Button
48 android:id="@+id/button1"
49 android:layout_width="wrap_content"
50 android:layout_height="wrap_content"
51 android:layout_alignParentLeft="true"
52 android:layout_alignParentTop="true"
53 android:layout_marginLeft="16dp"
54 android:layout_marginTop="19dp"
55 android:text="15" />
56
57 <Button
58 android:id="@+id/button2"
59 android:layout_width="wrap_content"
60 android:layout_height="wrap_content"
61 android:layout_alignBottom="@+id/button1"
62 android:layout_centerHorizontal="true"
63 android:text="30" />
64
65 <Button
66 android:id="@+id/button3"
67 android:layout_width="wrap_content"
68 android:layout_height="wrap_content"
69 android:layout_alignBaseline="@+id/button2"
70 android:layout_alignBottom="@+id/button2"
71 android:layout_alignParentRight="true"
72 android:layout_marginRight="21dp"
73 android:text="60" />
74
75 <Button
76 android:id="@+id/button4"
77 android:layout_width="wrap_content"
78 android:layout_height="wrap_content"
79 android:layout_alignLeft="@+id/button1"
80 android:layout_below="@+id/button1"
81 android:text="90" />
82
83 <Button
84 android:id="@+id/button5"
85 android:layout_width="wrap_content"
86 android:layout_height="wrap_content"
87 android:layout_alignBottom="@+id/button4"
88 android:layout_alignLeft="@+id/button2"
89 android:text="120" />
90
91 </RelativeLayout>
92
93 <Button
94 android:id="@+id/btCancel"
95 android:layout_width="match_parent"
96 android:layout_height="wrap_content"
97 android:onClick="cancelRepeatingTimer"
98 android:padding="@dimen/padding_medium"
99 android:text="@string/btCancel"/>
100 <!-- tools:context=".WidgetAlarmManagerActivity" -->
101</LinearLayout>
102</ScrollView>

Antworten
impjor
  • Forum-Beiträge: 1.793

07.12.2013, 09:31:39 via App

Das sieht schon besser aus!
Allerdings geht es noch kompakter, wenn du allen Buttons einen OnClickListener zuweist, der dann am Anfang prüft, ob view.getId() == R.id.deinButton1 ist. Dementsprechend wird dann eine Variable intervall gesetzt, die du dann im weiteren Verlauf benutzt.

Ich denke aber immernoch, dass es folgendes Problem sein könnte, oder hast du das schon mal probiert?

impjor
Kann es sein, dass du erst noch die Actions usw. zu deinem Intent hinzufügen musst, bevor du ihn cancelst?

LG

Liebe Grüße impjor.

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

Antworten
Bernd Roth
  • Forum-Beiträge: 98

07.12.2013, 13:15:18 via Website

Hallo,
danke dir für deinen input. Ich bin es leider von Java her gewohnt Button clicks so zu verwerten werde mich aber umstellen. Beim action hinzufügen für die intents weiss ich leider nicht mehr weiter, kannst du mir hierbei helfen?

Antworten
impjor
  • Forum-Beiträge: 1.793

07.12.2013, 19:47:21 via App

Auch bei Swing wird soetwas unschön sein.

Du machst einfach denselben Intent wie zum starten wie zum stoppen. Nur ohne extra, nur Action, Categories usw.

LG

Liebe Grüße impjor.

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

Antworten
Bernd Roth
  • Forum-Beiträge: 98

07.12.2013, 21:15:52 via Website

Ich habe 2 Versuche unternommen,bin mir aber nicht sicher, ob du es so gemeint hast - im Moment stehe ich ja komplett an.

1ster Versuch:

1public void CancelAlarm(Context context)
2 {
3 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
4 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
5 if(intent.getAction().equals("15") && intent1.getAction().equals("30")){
6 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
7 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
8 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
9 try{
10 alarmManager.cancel(sender);
11 alarmManager.cancel(sender1);
12 } catch(Exception e) {
13 Toast.makeText(context, "Wiederholung konnte nicht gestoppt werden, bitte Telefon neu starten!", Toast.LENGTH_LONG).show();
14 }
15 }else{
16 Toast.makeText(context, "No itent machtes", Toast.LENGTH_SHORT).show();
17 }
18 }

2ter Versuch:

1public void CancelAlarm(Context context)
2 {
3 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
4 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
5 if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) && intent1.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
6 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
7 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
8 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
9 try{
10 alarmManager.cancel(sender);
11 alarmManager.cancel(sender1);
12 } catch(Exception e) {
13 Toast.makeText(context, "Wiederholung konnte nicht gestoppt werden, bitte Telefon neu starten!", Toast.LENGTH_LONG).show();
14 }
15 }else{
16 Toast.makeText(context, "No itent machtes", Toast.LENGTH_SHORT).show();
17 }
18 }

Beide Male ist die App leider abgestürzt!

Antworten
impjor
  • Forum-Beiträge: 1.793

07.12.2013, 21:37:55 via App

Wenn die App abstürzt, immer LogCat posten!

Dein Code ist aber falsch: Du prüfst. if (intent.getAction()....), da du aber selber keine Action gesetzt hast, wird das nie zutreffen.
Du musst die Action setzetn bevor du cancelst, damit dein AlarmManager "weis" welcher Alarm gemeint ist.
Lösungsansatz: Lass die Actions überall weg und übergebe den Intervall (1t, 30, ...) stattdessen in einem Extra.

LG

Liebe Grüße impjor.

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

Antworten
Bernd Roth
  • Forum-Beiträge: 98

07.12.2013, 22:01:26 via Website

Soll ich den Intervall bereits in der MainActivity Klasse mithilfe der extras übergeben. Sprich in den einzelnen Buttons Intent.putExtra etc schreiben?

Antworten
Bernd Roth
  • Forum-Beiträge: 98

07.12.2013, 23:01:29 via Website

Hallo,
ich hoffe, dass ich es soweit halbwegs richtig gemacht habe.
Ich kann beide AlarmManager stoppen, jedoch habe ich das Problem, dass immer nur die Nachricht mit dem Text "15" versendet wird.
Ich gehe einmal davon aus, dass ich in der onReceive - Methode die Intent.extras korrekt abfrage? ...
Ich weiss der Code ist noch nicht sauber genug, aber sobald es läuft räume ich den natürlich auf.

Wo denkst du könnte bei mir noch der Fehler liegen?

Danke Dir vielmals für Deine Hilfe bis jetzt!

1package at.parken.parken;
2
3public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
4
5 final public String ONE_TIME = "onetime";
6 final public String SECOND = "second";
7 SharedPreferences sp, kennzeichen, telefonnummer;
8 Editor e;
9 int counter = 0;
10 String eigeneTelefonnummer = "xxx";
11
12 @Override
13 public void onReceive(Context context, Intent intent) {
14 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
15 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
16 //Acquire the lock
17 wl.acquire();
18
19 //Do the processing
20 Bundle extras = intent.getExtras();
21
22 /* zeitbuchung */
23 sp = context.getSharedPreferences("a", 0);
24 String value = sp.getString("a", "");
25
26 /* kenzeichen */
27 kennzeichen = context.getSharedPreferences("kennzeichen", 1);
28 String valueKennzeichen = kennzeichen.getString("kennzeichen", "");
29
30 /* Telefonnummer */
31 telefonnummer = context.getSharedPreferences("handyparken", 1);
32 String valueTelefonnummer = telefonnummer.getString("handyparken", "");
33
34 SmsManager smsManager = SmsManager.getDefault();
35
36 if(valueTelefonnummer.length() == 0 || valueKennzeichen.length() == 0)
37 Toast.makeText(context, "Bitte speichern Sie Telefonnummer und Kennzeichen, siehe Menueeinstellungen in der Notificationbar!", Toast.LENGTH_LONG).show();
38 else if (extras != null && extras.getBoolean("IsRepeat15", true)){
39 smsManager.sendTextMessage(valueTelefonnummer, null, "15" + " Wien*" + valueKennzeichen, null, null);
40 //smsManager.sendTextMessage(valueTelefonnummer, null, "30" + " Wien*" + valueKennzeichen, null, null);
41 }else if(extras != null && extras.getBoolean("IsRepeat30", true)){
42 smsManager.sendTextMessage(valueTelefonnummer, null, "30" + " Wien*" + valueKennzeichen, null, null);
43 }
44 //Release the lock
45 wl.release();
46 }
47 public void SetAlarm(Context context, String parkschein, long timer, int hour, int minute){
48 if(timer != 0 && parkschein == "15"){//set repeating timer
49 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
50 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
51 Bundle extras = new Bundle();
52 extras.putBoolean("IsRepeat15", true);
53 intent.putExtras(extras);
54 intent.setAction("RepeatAction");
55 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
56 //when to start
57 Calendar timeOff9 = Calendar.getInstance();
58 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
59 timeOff9.set(Calendar.MINUTE, minute);
60 //when to start
61 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 1*6000, pi);
62 }else if(timer != 0 && parkschein == "30"){
63 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
64 Intent intent1 = new Intent(context, AlarmManagerBroadcastReceiver.class);
65 Bundle extras = new Bundle();
66 extras.putBoolean("IsRepeat30", true);
67 intent1.putExtras(extras);
68 intent1.setAction("RepeatAction");
69 PendingIntent pi1 = PendingIntent.getBroadcast(context, 1, intent1, 0);
70 //when to start
71 Calendar timeOff9 = Calendar.getInstance();
72 timeOff9.set(Calendar.HOUR_OF_DAY, hour);
73 timeOff9.set(Calendar.MINUTE, minute);
74 //when to start
75 am.setRepeating(AlarmManager.RTC_WAKEUP, timeOff9.getTimeInMillis(), 2*6000, pi1);
76 }else{//one timer
77 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
78 AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
79 Bundle extras = new Bundle();
80 extras.putBoolean("IsRepeat", true);
81 intent.putExtras(extras);
82 intent.setAction("RepeatAction");
83 PendingIntent pi = PendingIntent.getBroadcast(context, 1, intent, 0);
84 am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
85 }
86 }
87 public void CancelAlarm(Context context)
88 {
89 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
90 Bundle extras = new Bundle();
91 extras.putBoolean("IsRepeat15", true);
92 intent.putExtras(extras);
93 intent.setAction("RepeatAction");
94 PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
95 PendingIntent sender1 = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
96 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
97 sender.cancel();
98 sender1.cancel();
99 alarmManager.cancel(sender);
100 alarmManager.cancel(sender1);
101 }
102}

Antworten