Android-Neuling sucht Hilfe

  • Antworten:31
  • OffenNicht stickyBentwortet

08.04.2012 20:51:35 via Website

Hallo liebe Forum-User,
ich bin neu hier und habe vor kurzem begonnen meine erste App für meinen Modellbau-Verein zu schreiben. Da ich eigentlich keinerlei Java-Kenntnisse besitze, habe ich mir alles mit Hilfe von Tuts und How-To´s sowie Learning-by-Doing "ercodet".
Bei meiner App handelt es sich um eine Art "Status-Abfrage". Wir haben einen Server, auf dem eine Textdatei liegt die zwischen zwei Texten hin- und herschaltet. Meine bisherige App ruft diesen Text auf Knopfdruck online ab und gibt mir dann je nach Text den Status "ON" oder "OFF" aus.

Die nächste Version der App soll nun einen Überwachungsmodus haben, der alle x-Minuten im Hintergrund den Status abruft und bei Änderung eine Meldung ausgibt. Das habe ich soweit auch alles einigermaßen hinbekommen. Leider funktioniert die Überwachung noch nicht so ganz. Ich stehe quasi kurz vor der Vollendung. Nun hoffe ich auf eure Hilfe. :grin:

Lg Patrick

08.04.2012 20:56:55 via Website

Hier mal mein erstes Problem:

Ich habe die Zeitauswahl mit einer RadioGroup gemacht und möchte nun aber, dass meine App erkennt, wenn einer der RadioButtons ausgewählt wurde und falls dies nicht der Fall ist, soll er mir ne Fehlermeldung geben.

Ich hoffe das ich euch jetzt nicht überrumpel.
Mein Code-Fehler liegt defintiv in Code-Zeile "5" !
Aber ich komm einfach nicht auf den richtigen Zweig. Die Möglichkeit mit ".getCheckedRadioButtonId" , da weis ich leider nicht, wie ich dann meinen riesigen Befehl da mit einbauen kann, wenn ihr wisst was ich meine.

Hier mal mein ein Teil meines bisherigen Codeversuches:

1public void okButton (View view) {
2
3
4 RadioGroup groupi = (RadioGroup) findViewById(R.id.radioGroup1);
5 if (groupi.isSelected()){
6 android.app.AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
7 builder2.setMessage("Die App schaltet nun in den Überwachungsmodus");
8 builder2.setCancelable(true);
9
10
11 RadioButton test1 = (RadioButton) findViewById(R.id.radioButton0);
12 RadioButton test2 = (RadioButton) findViewById(R.id.radioButton1);
13 RadioButton test3 = (RadioButton) findViewById(R.id.radioButton2);
14 RadioButton test4 = (RadioButton) findViewById(R.id.radioButton3);
15
16 // get a Calendar object with current time
17 final Calendar cal = Calendar.getInstance();
18 // add minutes to the calendar object
19 if (test1.isChecked() ){
20 cal.add(Calendar.MINUTE, 1);
21
22 }else if (test2.isChecked()){
23 cal.add(Calendar.MINUTE, 20);
24 }
25 else if (test3.isChecked()){
26 cal.add(Calendar.MINUTE,30);
27 }
28 else if (test4.isChecked()){
29 cal.add(Calendar.MINUTE,60);
30
31 }else{}
32
33 Intent intent = new Intent(this, AlarmReceiver.class);
34 final PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
35
36
37 builder2.setPositiveButton("OK", new DialogInterface.OnClickListener() {
38 public void onClick(DialogInterface dialog, int which) {
39
40 initNotification();
41 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
42 am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
43
44 }
45 });
46
47
48
49 builder2.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
50 public void onClick(DialogInterface dialog, int which) {
51 Toast.makeText(getApplicationContext(), "Aktion abgebrochen", Toast.LENGTH_LONG).show();
52 }
53 });
54 AlertDialog dialog2 = builder2.create();
55 dialog2.show();
56 }else{Toast.makeText(getApplicationContext(), "Bitte Zeit wählen!", Toast.LENGTH_LONG).show();}}

Ich würde mich wirklich sehr über ein wenig Hilfe freuen :)

Lg Patrick

— geändert am 09.04.2012 15:06:11

10.04.2012 16:15:02 via Website

*push*

Ich hoffe dass pushen erlaubt ist.
Ich würde mich nämlich sehr über ein paar Tipps von euch freuen. Komme hier nämlich echt nicht weiter :wacko:

— geändert am 10.04.2012 16:15:16

10.04.2012 16:27:58 via Website

Patrick
*push*
Ich hoffe dass pushen erlaubt ist.
nicht wirklich

aber trotzdem:

— geändert am 10.04.2012 16:28:52

L.G. Erwin :*

♛SXZ1c, SGS2, SGS+, SG Tab 2 10.1, Apfel 4S♛
★Wissen ist Macht. Nichts wissen macht nichts★
►Wer einen Rechtschreibfehler findet darf ihn behalten◄

10.04.2012 18:03:57 via Website

Die Möglichkeit mit ".getCheckedRadioButtonId"
...wäre zielführend.
Alternativ könntest du auch direkt den Zustand des für die Bedingung relevanten Buttons abfragen.


da weis ich leider nicht, wie ich dann meinen riesigen Befehl da mit einbauen kann, wenn ihr wisst was ich meine.

Nö, weiß ich nicht - was wäre denn beim Einsatz der "neuen" Funktion anders als bei der "alten"?

10.04.2012 20:52:54 via Website

nicht wirklich

Ok, sorry hierfür; kommt nicht wieder vor.

Ansonsten erstmal vielen Dank an "and dev" für deine Antwort.

Hab das jetzt mit ".getCheckedRadioButtonId" hinbekommen. Der Code ist zwar etwas länger geworden, aber das macht ja nichts :grin:

Nun aber zum nächsten Problem. Wenn meine App in den Überwachungsmodus geschaltet hat, habe ich immer noch die App aufm Schirm und muss auf den Home-Button drücken um diese zu "minimieren", damit sie nach der Meldung wieder aufgerufen werden kann. Gibts ne Möglichkeit dies ohne drücken des Home-Buttons zu realisieren?

— geändert am 10.04.2012 21:16:02

10.04.2012 22:27:49 via App

Hi Patrick,
Patrick
nicht wirklich
Der Code ist zwar etwas länger geworden, aber das macht ja nichts :grin:
Das ist meistens der Sinn vom entwickeln :)


Nun aber zum nächsten Problem. Wenn meine App in den Überwachungsmodus geschaltet hat, habe ich immer noch die App aufm Schirm und muss auf den Home-Button drücken um diese zu "minimieren", damit sie nach der Meldung wieder aufgerufen werden kann. Gibts ne Möglichkeit dies ohne drücken des Home-Buttons zu realisieren?
Du kannst entweder ein Intent an den Homescreen schicken, oder mit finish() deine derzeitige Activity beenden.

Liebe Grüße Maximilian

Vergesse nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag :grin: - Birthdays Website

12.04.2012 14:46:00 via Website

Ok, auch wenns vielleicht nervig klingt; aber ich glaube, ich bräuchte ein letztes Mal eure kompetente Hilfe.
Und zwar folgendes:

Ich starte in meiner ersten Activity per Button einen AlarmManager mit eingestellter Zeit. Dieser startet nach der angegebenen Zeit eine zweite Activity für mich, die im Hintergrund läuft. Diese Activity durchläuft eine If-Abfrage.
Nun zu meinem Problem:
1If (write.equalsIgnoreCase(data)) {
2// Code-Teil 1
3}else{
4Intent intent = getIntent();
5finish();
6startActivity(intent);}

Im "else-Teil" soll die Activity neu gestartet werden, jedoch mit der Zeit die ich auch zuvor für den AlarmManager genutzt hatte. Ist dies zu realisieren?

12.04.2012 22:17:13 via App

Hi Patrick,
ich verstehe den letzten Teil von deiner Frage nicht so ganz. Mit welcher Zeit willst du die Activity starten? Und warum überhaupt mit einer Zeit?
Bitte etwas mehr Erklärung :)

Liebe Grüße Maximilian

Vergesse nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag :grin: - Birthdays Website

13.04.2012 11:51:40 via Website

Hi Maximilian,
meine App soll alle x-Minuten online einen Text abrufen und überprüfen, ob dieser sich geändert hat.
Dafür nutze ich in meiner ersten Activity den AlarmManager, der mit meiner zuvor, aus einer RadioButtonGroup gewählten Zeit, dann meine zweite Activity startet. Diese schaut nach ob sich etwas am Onlinetext geändert hat.

Nun zum Problem:

Wenn sich nichts geändert hat, soll sie erneut nachschauen, jedoch mit dem selben Zeitabstand, den ich vorher auch für den AlarmManager definiert hatte. Im Moment schaut sie dann aber jede Sekunde nach.

Lg Patrick

13.04.2012 20:55:30 via Website

Hi Maximilian, vielen Dank für deine erneute, sehr hilfreiche Antwort.
Ich bekomm das mit dem "AlarmManager.setRepeating(...)" aber nich so ganz hin. Er nimmt da immer noch ne Falsche Zeit. Wäre nett wenn mich jemand mal mit der Nase auf meinen Code Fehler stupsen könnte.

Hier mal der Code-Schnipsel für 1-Minute als Zeit:

1if (groupi.getCheckedRadioButtonId() == test1.getId()){
2 cal.add(Calendar.MINUTE, 1);
3 Intent intent = new Intent(this, AlarmReceiver.class);
4 final PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
5
6
7 builder2.setPositiveButton("OK", new DialogInterface.OnClickListener() {
8 public void onClick(DialogInterface dialog, int which) {
9
10 initNotification();
11 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
12 am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), SystemClock.elapsedRealtime(), sender);
13
14
15 Intent startMain = new Intent(Intent.ACTION_MAIN);
16 startMain.addCategory(Intent.CATEGORY_HOME);
17 startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
18 startActivity(startMain);

Mein Fehler liegt denke ich mal in Zeile 12 am Long Interval ?!

@ Markus, habe mir das mit dem c2dm-Service mal angeschaut. Ist ja schon ne feine Sache aber so wie ich gelesen habe, benötigt man dafür einen Google-Acc und ob jeder Nutzer meiner App bereit ist sich einen einzurichten weiß ich nicht.

Lg

— geändert am 13.04.2012 20:56:18

14.04.2012 10:37:47 via Website

Patrick

Mein Fehler liegt denke ich mal in Zeile 12 am Long Interval ?!

Jup, war auch so. Habs jetzt hinbekommen. Statt "SystemClock.elapsedRealtime()" musste ich für 1 Minute einfach 60000 angeben :rolleyes:

Ich werd meine App heute testen und hoffe, dass endlich alles ohne Probleme funktioniert. Bis dahin vielen vielen Dank für eure Unterstützung; hätte das alleine glaube ich nie geschafft.

Lg

14.04.2012 15:23:19 via Website

Schon wieder ich.
So schnell wie die Freude heute aufkam, dass es wohl funktioniert, so schnell verschwand diese auch wieder. Habe die App jetzt über knapp 5 Stunden getestet und versucht die Fehler zu beheben. Jedoch habe ich nach wie vor 3 Fehler, die ich einfach nicht beheben kann:

Fehler 1:
Wenn meine App in den "Überwachungsmodus" schaltet, startet sie eine Notification. Wenn ich nun in der Status-Bar auf die Notification klicke, soll sich die App, die ich vorher "minimiert" habe an der selben Stelle wieder auftun. Irgendwie will das aber nicht.
Minimiert wird mit:
1Intent startMain = new Intent(Intent.ACTION_MAIN);
2 startMain.addCategory(Intent.CATEGORY_HOME);
3 startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4 startActivity(startMain);

Fehler 2:
Gibt es eine Möglichkeit den "AlarmManager.setRepeating(...)" wieder zu stoppen?
Klar mit "am.cancel(...);" aber mein AlarmManager ist in einem Button definiert und ich möchte diesen nun mit einem zweiten stoppen können.

Fehler 3:
Wenn ich den "AlarmManager.setRepeating(...)" gestartet habe und dieser meine Activity nach der eingestellten Zeit das 2,3,4 .... mal startet, bekomm ich einen schwarzen Bildschirm. Ich möchte aber, dass der User davon nichts mitbekommt und sein Telefon weiter ungestört nutzen kann.


Eigentlich trau ich mich ja schon gar nicht mehr diese Fehler hier zu posten, weil ihr bestimmt denkt: "Soll er doch endlich mal Java lernen". Und ja, ihr habt Recht! Ich werde mir deshalb wahrscheinlich demnächst mal ein Buch zum lernen besorgen, damit ich euch nicht dauernd nervende Fragen stellen muss.

Lg

15.04.2012 15:34:36 via Website

Hi Patrick,
nur mal eine kleine Hilfe zu deinem 2. Fehler.

So legst du ja ein PendingIntent an:
1PendingIntent sender = PendingIntent.getBroadcast(context, BIRTHDAY_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Der BIRTHDAY_REQUEST_CODE ist dabei die Unique Id. Mittels dieser kannst du einfach über alarmManager.cancel(PendingIntent sender) wieder schließen. Also du legst einfach an einer anderen Stelle das selbe PendingIntent an mit derselben Id. Diese übergibst du dann der Methode cancel().

Das hätte dir aber auch alles Google gesagt :)

So, an den anderenen Fehlern probierst du dich jetzt erst einmal selber :grin:

Liebe Grüße Maximilian

Vergesse nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag :grin: - Birthdays Website