Menü: App close & 2te Seite

  • Antworten:22
  • Bentwortet
Jan H.
  • Forum-Beiträge: 16

21.12.2012, 23:27:25 via Website

Hallo Community,

ich möchte im Menü (Menü-Taste) zwei "Links" haben.

1.) "Schließen" => App wird geschlossen.
2.) "Information" => Neue Seite (Layer) wird aufgerufen.

Soweit klappt alles wunderbar aber ich glaube das der Code nicht ganz richtig ist (sieht in der Übersicht komisch aus) :-(

Hier mal mein Quellcode:
1@Override
2 public boolean onCreateOptionsMenu(Menu menu) {
3 getMenuInflater().inflate(R.menu.main_menu, menu);
4 super.onCreateOptionsMenu(menu);
5 return true;
6 }
7
8 @Override
9 public boolean onOptionsItemSelected(MenuItem item) {
10 if(item.getItemId() == R.id.menu_info) {
11
12 // Zeige Informationsseite (info.xml)
13 setContentView(R.layout.info);
14 return true;
15 }
16
17 // Schließt die App
18 {
19 System.exit(0);
20 return true;
21 }
22 }

main_menu = Menü-Datei (main_menu.xml)
menu_info = String = Schließen
info = Neuer Layer (Seite) die ausgegeben werden sollen beim klick auf "Information"


Freundliche Grüße und vielen Dank im voraus
Jan H.

— geändert am 26.12.2012, 02:50:46

Antworten
Appsoluts
  • Forum-Beiträge: 304

23.12.2012, 13:21:54 via Website

Dein Fehler liegt im onOptionsItemSelected !
Du musst hier unterscheiden, welchen der beiden "Links" du drückst...

Richtig funktionieren tut es, wenn du folgendes machst.

@Override
9 public boolean onOptionsItemSelected(MenuItem item) {
10 if(item.getItemId() == R.id.menu_info) {
11
12 // Zeige Informationsseite (info.xml)
13 setContentView(R.layout.info);
14 return true;
15 }

// Schließt App & geht zum Homescreen
18 if(item.getItemId() == (DIE RESSOURCE ZUM CLOSEN z.B. R.id.close) {
19 System.exit(0); // Hier würde ich eher this.dismiss() benutzen !
20 return true;
21 }

Jan H.

Antworten
Jan H.
  • Forum-Beiträge: 16

23.12.2012, 14:33:38 via Website

Danke CBsol Android!
So wollte ich das haben :-)

Aber du meintes, du würdest lieber "this.dismiss()" benutzen.
Warum?
Unterschied zwischen "this.dismiss()" und "System.exit(0)"?

Weil beim "System.exit(0)" wird die App geschlossen und beim "this.dismiss()" passiert bei mir garnichts.

Quellcode mit "this.dismiss()":
1@Override
2 public boolean onOptionsItemSelected(MenuItem item) {
3
4 // Zeige Information (info.xml)
5 if(item.getItemId() == R.id.menu_info) {
6 setContentView(R.layout.info);
7 return true;
8 }
9
10 // App wird geschlossen
11 if(item.getItemId() == R.id.menu_exit) {
12 this.dismiss();
13 return true;
14 }
15
16 return false;
17 }
18
19 private void dismiss() {
20 // TODO Auto-generated method stub
21
22 }

Antworten
Appsoluts
  • Forum-Beiträge: 304

23.12.2012, 16:26:36 via Website

Ne ist i.O. mit exit. Kenne den restlichen Code nicht daher ist zum Schließen exit schon ok ;)

Gruß

Antworten
Jan H.
  • Forum-Beiträge: 16

23.12.2012, 19:49:10 via Website

Ok, vielen Dank!

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

23.12.2012, 20:11:38 via Website

1System.exit(0);
ist definitiv NICHT OK. Es bewirkt,dass die laufende VM hart abgeschossen wird - es findet also kein Finalizing der erzeugten Objekte und keine Garbage Collection mehr statt! Also auf jeden Fall eine Activity immer mit
1finish();
verlassen...

Jan H.

Antworten
Appsoluts
  • Forum-Beiträge: 304

24.12.2012, 11:53:40 via Website

Mit finish() schließt du möglicherweise aber nicht die gesamte App sondern nur die laufende Activity.

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

24.12.2012, 17:01:55 via Website

CBsol Android
Mit finish() schließt du möglicherweise aber nicht die gesamte App sondern nur die laufende Activity.

Das ist korrekt. Gleichzeitig würde ich aber auch gerne ein Vote gegen das Schließen von Apps abgeben da dies eigentlich schlechter Stil ist. Hier eine kurze Erläuterung von Ms. Hackborn einer Android Entwicklerin:

We did not want to require that users close applications when "done" with them. Such a usage pattern does not work well in a mobile environment, where usage tends to involve repeated brief contact with a wide variety of applications throughout the day.

Antworten
Appsoluts
  • Forum-Beiträge: 304

25.12.2012, 00:25:11 via Website

Deshalb sind auch Apps wie Taskkiller so erfolgreich ;)

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

25.12.2012, 11:10:08 via Website

Die sind deshalb so erfolgreich, weil Tausende von Entwicklern das Lebenszykluskonzept von Softwarekomponenten unter Android nicht verstanden haben oder zu faul sind, Ihre Apps entsprechend zu implementieren und dadurch nicht vernünftig mit den begrenzten Ressourcen umgehen.

Und nochmal:
1System.exit(0);
ist nicht die korrekte Art, eine ganze App zu beenden. Damit wird das komplette Lebenszyklus-Management des Betriebssystems ausgehebelt. Daten werden nicht mehr ordentlich gespeichert (onPause, onResume et al.), Ressourcen unter Umständen nicht freigegeben... Das ist so, als würdest du, um Word zu beenden, den PC ausschalten...

Antworten
Jan H.
  • Forum-Beiträge: 16

25.12.2012, 13:12:34 via App

Wie denn?

Antworten
Appsoluts
  • Forum-Beiträge: 304

25.12.2012, 16:10:21 via Website

Sorry aber das ist nicht korrekt...
Nicht die Entwickler sind schuld daran, viel mehr sind es die User, denen eingeredet wird, dass nicht geschloßene Apps den RAM Speicher belegen und so das Handy langsamer machen.

Mit .finish() kannst du jedoch sauber jede Activity schließen.

Antworten
Jan H.
  • Forum-Beiträge: 16

25.12.2012, 18:04:34 via Website

CBsol Android:
Mit .finish() kannst du jedoch sauber jede Activity schließen.

Das glaube ich nicht. Ich vermute das bei "finish();" nur die App im Hintergrund gepackt wird.

Wenn ich die App mit finish(); beende, wird die App bei meinen Taskiller noch angezeigt aber bei System.exit(0); wird die App NICHT mehr bei meinen Taskiller angezeigt.

Antworten
Phil G.
  • Forum-Beiträge: 86

25.12.2012, 18:38:46 via Website

Mit .finish() kannst du jedoch sauber jede Activity schließen.
Das glaube ich nicht. Ich vermute das bei "finish();" nur die App im Hintergrund gepackt wird.

Lies mal das Android SDk bevor du hier so neunmal klug daher kommst. Natürlich schliesst .finish jede Activity, wenn deine App natürlich nur aus einer Activity besteht, dann beendet es natürlich diese bzw. kehrt zum Launcher zurück.

Liest du auch manchmal die Tipps die die Leute hier schreiben ??? oder geht es hier nur darum dein System Exit abgesegnet zu bekommen ?

Ein paar Artikel weiter oben wird geklärt warum Apps niemals geschlossen werden und wie der App Lifecycle unter der mobilen Plattform Android funktioniert.
Das heisst es wird lediglich dem System mitgeteilt: "So Achtung die App hier ist zu Ende und kann bei Speicherbedarf rausgeworfen werden." Sobald das System der Meinung ist es ist notwendig dann räumt es von alleine auf.
Was du vor hast ist ein Eingriff in das Standardverhalten von Android. Hast du schon mal nachgedacht warum beim manuellen Beenden einer App (Einstellungen->Anwendungen->Anwendungen verwlaten) immer eine Warnmeldung kommt, das dies zu Instabilitäten führen kann?

— geändert am 25.12.2012, 20:27:45

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

25.12.2012, 18:51:09 via Website

@Jan: das die App im Taskmanager / Taskkiller noch angezeigt wird, ist nur in den seltensten Fällen ein Problem. Wie Phil (sicherlich in leicht unpassendem Tonfall) schon schrieb, entscheidet das System, wann es die App endgültig aus dem Speicher räumt.
Es kann allerdings auch ein Problem bestehen: Wenn deine Activity noch als Referenz an irgendeine Komponente (LocationManager oder ähnliches) übergeben wurde, dann hält diese Komponente diese Referenz auch weiterhin, mit der Folge, dass die Garbage Collection nicht greift und die App im Speicher behalten wird, obwohl finish(); aufgerufen wurde... Also in onPause() und onResume() immer schön darauf achten, das alle Referenzen, Ressourcen, WakeLocks usw. entsprechend verwaltet werden.

Jan H.

Antworten
Appsoluts
  • Forum-Beiträge: 304

25.12.2012, 19:34:45 via Website

Phil G.
Mit .finish() kannst du jedoch sauber jede Activity schließen.
Das glaube ich nicht. Ich vermute das bei "finish();" nur die App im Hintergrund gepackt wird.

Lies mal das Android SDk bevor du hier so neunmal klug daher kommst. Natürlich schliesst .finish jede Activity, wenn deine App natürlich nur aus einer Activity besteht, dann beendet es natürlich diese bzw. kehrt zum Launcher zurück.

Liest du auch manchmal die Tipps die die Leute hier schreiben ??? oder geht es hier nur darum dein System Exit abgesegnet zu bekommen ?

Ein paar Artikel weiter oben wird geklärt warum Apps niemals geschlossen werden und wie der App Lifecycle unter der mobilen Plattform Android funktioniert.
Das heisst es wird lediglich dem System mitgeteilt: "So Achtung die App hier ist zu Ende und kann bei Speicherbedarf rausgeworfen werden." Sobald das System der Meinung ist es ist notwendig dann räumt es von alleine auf.
Was du vor hast ist ein Eingriff in das Standardverhalten von Android. Hast du schon mal nachgedacht warum beim manuellen Beenden einer App (Einstellungen->Anwendungen->Anwendungen verwlaten) immer eine Warnmeldung kommt, das dies zu Instabilitäten führen kann?


Starke nachricht... lies erstmal den Thread bevor du irgendwas kritisierst... das, was du hier schreibst, wurde schon mindestens 2x gesagt ...

Jan H.

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

25.12.2012, 19:58:05 via Website

Leute, kommt mal wieder runter. Es ist Weihnachten und wir treiben uns in diesem Forum rum, um uns gegenseitig zu helfen!

Jan H.

Antworten
Phil G.
  • Forum-Beiträge: 86

25.12.2012, 20:26:44 via Website

@Thomas M. :

ja sorry für den Tonfall,


Starke nachricht... lies erstmal den Thread bevor du irgendwas kritisierst... das, was du hier schreibst, wurde schon mindestens 2x gesagt ...

Tja um so mehr wundert es mich immer wieder das die Fragensteller oft das (weiter)Lesen verlernt haben ...

— geändert am 25.12.2012, 20:30:05

Antworten
Jan H.
  • Forum-Beiträge: 16

26.12.2012, 02:58:55 via Website

Vielen Dank für eure Hilfe. Meine Frage wurde beantwortet.

PS an Phil G.: Wenn du meinst mich "fertig zu machen", dann suche dir bitte ein Therapeuten, weil dies ist, wie du wahrscheinlich noch nicht bemerkt hast, ist ein Forum. Hier geht es nicht um jemand anderen "fertig zu machen", sondern um ein oder mehren Themen zu diskutieren, Fragen zu beantworten oder ähnlichem.

Antworten
Phil G.
  • Forum-Beiträge: 86

26.12.2012, 11:03:07 via Website

Um Gottes Willen ich will Dich nicht fertig machen, ich sehe das Forum genau wie du als Quelle der Inspiration und Hilfe.
Oft ist es hier nur so das Leute eine Frage stellen, am liebsten eine fertige Lösung haben wollen und selten bis gar nicht auf Antworten reagieren bzw. nicht willens sind etwas Eigeninitative zu zeigen... deswegen bitte ich meine Überreaktion zu entschuldigen.

Also noch mal sorry :) . Ich wollte Dir nicht ans Bein .... piep .

— geändert am 26.12.2012, 11:06:55

Antworten
Jan H.
  • Forum-Beiträge: 16

26.12.2012, 22:56:53 via Website

Kein Problem.
Ich habe ja nun meine Antwort auf meine Frage, also ist für mich dieses Thema beendet.

Antworten