# App ist nur Scheibchenweise zu schliessen



## Gast2 (9. Okt 2012)

Hallo,

ich habe mich entschlossen einen Menüpunkt zu führen der heißt "App beenden".
(Ich weiß, bei manchen soll das unbeliebt sein, ich aber will es so.)

Aufgerufen wird:
	
	
	
	





```
@Override
	public boolean onCreateOptionsMenu(Menu menu1) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.optionsmenu, menu1);
		this.menu = menu1;
		return super.onCreateOptionsMenu(menu1);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.shout_down:
			stopApp();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private void stopApp() {
		super.onDestroy();
		finish();
		System.exit(0);
	}
```

Wenn ich diesen Menüpunkt anwähle, dann wird aber immer nur die letzte Activity geschlossen und die vorherige kommt zum Vorschein, ähnlich wie bei der Zurück-Funktion.

Muss ich evtl. beim Wechsel der Activity die vorherige hart beenden (wenn ja wie)?

Oder *wie kann ich die App mit einmal beenden?*

Mit Dank,
der Frank


----------



## Network (9. Okt 2012)

Ich weiss vieleicht blöde Frage und nicht direkt eine Antwort, aber warum verwendest du mehrere Activities?
Kenne keinen Fall den man auch irgendwie anderst lösen könnte. Eine Activity stellt doch normalerweise immer eine art eigene App-Instanz für sich dar, du lässt also mehrere Apps gleichzeitig laufen???

PS: Wusste nicht dass der Beenden Button unbeliebt ist, würde aber erklären warum man ihn in 50% aller Apps nicht findet. Manche lassen sich ja zusätzlich dann noch nichtmal über den Zurückbutton beenden bzw. über irgendeinen anderen Weg als den Taskmanager. Schade.


----------



## Sen (9. Okt 2012)

So weit ich das las, geht man standartmässig davon aus, dass du für ein "neues" Fenster auch eine neue Activity benutzt. Da der Wechsel zwischen den Activities recht einfach abläuft, bietet sich das an diese zu nutzen.

Zum beenden habe ich leider nur eine etwas radikale Lösung:
System.exit(0)


----------



## TheDarkRose (9. Okt 2012)

Ihr solltet euch beide mal den Android app lifecycle absehen. Activities sind eine Art Ansichten. Eine App kann mehrere Activities haben. Mit den Zurück - Button gehtman eine Activity zurück, mit dem Home - Button steigt man aus. Das Beenden übernimmt Android selbstständig bei Bedarf. Unter Android ist ein Taskmanager kontraproduktiv. 

Gesendet von meinem Nexus 7 mit Tapatalk 2


----------



## Network (9. Okt 2012)

TheDarkRose hat gesagt.:


> Ihr solltet euch beide mal den Android app lifecycle absehen. Activities sind eine Art Ansichten. Eine App kann mehrere Activities haben. Mit den Zurück - Button gehtman eine Activity zurück, mit dem Home - Button steigt man aus. Das Beenden übernimmt Android selbstständig bei Bedarf. Unter Android ist ein Taskmanager kontraproduktiv.
> 
> Gesendet von meinem Nexus 7 mit Tapatalk 2



Dem Zurück-Button kann jeder Programmierer jede Funktion zuweisen. Der Home-Button lässt die App nur in den Hintergrund verschwinden, dort kann sie immernoch weiterarbeiten und dass sie vom AndroidSystem automatisch entfernt wird nach "Speicherbedarf" oder ähnlichem kann man auch verhindern und ist damit nicht sichergestellt.
Häufig saugen diese Apps dann am besten im Hintergrund noch massig Batterielaufzeit, weil diese nicht richtig pausiert wurden/teilweise werden können(Da Android keinerlei Funktion diesbezüglich bereitstellt, selbst AndroidBeispielApps sind von diesem "Fehler" betroffen). Was macht man dann? Den Taskmanager aufrufen und die Zecken aus dem System killen.
Wenn ein Taskmanager kontraproduktiv wäre, hätte man ihn nicht implementiert.

Gruß
Net


----------



## TheDarkRose (9. Okt 2012)

Network hat gesagt.:


> Dem Zurück-Button kann jeder Programmierer jede Funktion zuweisen.
> Über Workarounds, ja, aber der Konvention, sollte die vorherige Activity erscheinen





Network hat gesagt.:


> Der Home-Button lässt die App nur in den Hintergrund verschwinden, dort kann sie immernoch weiterarbeiten und dass sie vom AndroidSystem automatisch entfernt wird nach "Speicherbedarf" oder ähnlichem kann man auch verhindern und ist damit nicht sichergestellt.


Was auch so sein soll und so ist es gedacht. Die meisten Apps hören auf zu arbeiten, außer sie haben einen eigen Background Thread.



Network hat gesagt.:


> Häufig saugen diese Apps dann am besten im Hintergrund noch massig Batterielaufzeit, weil diese nicht richtig pausiert wurden/teilweise werden können


Fehler beim Programmierer -> deinstalliert und schlechte Bewertung



Network hat gesagt.:


> (Da Android keinerlei Funktion diesbezüglich bereitstellt, selbst AndroidBeispielApps sind von diesem "Fehler" betroffen).


Beispielapps sind Beispielapps und sollen nur die eine Funktion demonstrieren, aber andere Sachen wie richtig pausieren werden dann außenvorgelassen.



Network hat gesagt.:


> Was macht man dann? Den Taskmanager aufrufen und die Zecken aus dem System killen.
> Wenn ein Taskmanager kontraproduktiv wäre, hätte man ihn nicht implementiert.


Nein, der Taskmanager kommt eher daher, dass viele zu Windowsgequält und kommen mit der Speicherphilosophie eines Androidgerätes nicht zurecht.


----------



## schlingel (9. Okt 2012)

> Ich weiss vieleicht blöde Frage und nicht direkt eine Antwort, aber warum verwendest du mehrere Activities?


Weil sich das so gehört und von Google so konzipiert wurde. Workarounds sind meistens mehr als weniger Pfusch.

Android ist darauf aufgebaut, dass du dem System sagst, was du machen möchtest und das System dir die passende Activity liefert. Android ist kein Desktop Linux! Man darf es auch so nicht programmieren, das gibt nur Brösel.



> Häufig saugen diese Apps dann am besten im Hintergrund noch massig Batterielaufzeit, weil diese nicht richtig pausiert wurden/teilweise werden können


Wenn eine Activity nichts tut (keine Threads, AsyncTasks), dann saugt sie auch keine Batteriezeit. 



> Wenn ein Taskmanager kontraproduktiv wäre, hätte man ihn nicht implementiert.


Gäbe es keine Pfusch-Apps, wäre er nicht produktiv ;-) Im Normalfall soll das System seine Resourcen selbst managen. Android ist darauf konzipiert möglich responsiv zu reagieren.

Siehe auch diese Diskussion.


----------



## Network (9. Okt 2012)

~ gelöscht
Bin im Moment zu müde um das auszudiskutieren. Das Problem ist einfach der Unterschied zwischen Praxis und Theorie. Werden immer unterschiedlich sein und man kann mit beiden richtig argumentieren zum selben Thema.

Net


----------



## TheDarkRose (9. Okt 2012)

Nur man selbst kann es besser machen, aber anstatt selbst pfusch apps zu schreiben. 

Gesendet von meinem Nexus 7 mit Tapatalk 2


----------



## mjdv (10. Okt 2012)

Network hat gesagt.:


> Häufig saugen diese Apps dann am besten im Hintergrund noch massig Batterielaufzeit, weil diese nicht richtig pausiert wurden/teilweise werden können(Da Android keinerlei Funktion diesbezüglich bereitstellt, selbst AndroidBeispielApps sind von diesem "Fehler" betroffen). Was macht man dann? Den Taskmanager aufrufen und die Zecken aus dem System killen.





schlingel hat gesagt.:


> Wenn eine Activity nichts tut (keine Threads, AsyncTasks), dann saugt sie auch keine Batteriezeit.



Wenn man keinen WakeLock hält, wird sogar die CPU in einen Sleep Modus gesetzt, wo nichts mehr ausgeführt wird!

Und im normalen Android gibt es keinen Task Manager, das hat vielleicht Samsung, aber sonst niemand.


----------



## MiDniGG (10. Okt 2012)

Um mal aufs Thema zurück zu kommen...

Du kannst, wenn Du die vorherige Activity nicht mehr brauchst, einfach ein finish() nach dem Aufruf der neuen Acitivty machen, dann sind im Hintergrund auch keine mehr auf. Wie und ob das dann allerdings mit dem Zurück-Button funktioniert weiß ich nicht und möchte ich jetzt auch nicht ausprobieren. ;-)

Ansonsten könntest Du all Deine Activities mit 
	
	
	
	





```
startActivityForResult
```
 aufrufen. Dann könntest Du beim "Beenden" einen entsprechenden Wert zurück liefern, der die letzte Activitiy auch zu einem finish() bewegt. (Wird dann in onActivityResult ausgelesen)


----------



## schlingel (10. Okt 2012)

> Wie und ob das dann allerdings mit dem Zurück-Button funktioniert weiß ich nicht und möchte ich jetzt auch nicht ausprobieren.


Du müsstest die Taste überschreiben und finish aufrufen. Sonst bleibt die Activity auf dem Activity-Stack.

Offtopic:


> Und im normalen Android gibt es keinen Task Manager, das hat vielleicht Samsung, aber sonst niemand.


Das hat ein jedes Android - ist über Settings -> Applications -> Deine Anwendung, erreichbar. Seit Android 4.0 bekommt man sogar eine detaillierte Auflistung der Prozesse die beendet werden können.

Allerdings ist das korrekt mit dem WakeLock, es bringt keine Performance-Vorteile. Im Gegenteil, es kostet nur mehr Zeit wenn eine App gestartet werden muss die anders (so wie es das System vorsieht) hibernated wurde.  

Apps selbst Beenden ist nur ein akzeptabler Weg, wenn es darum geht Services zu beenden die so lang laufen sollen wie die App verwendet wird und sich nicht selbstständig beenden können.


----------



## Gast2 (30. Nov 2012)

Ich habe was gefunden, was (bei mir) einwandfrei funktioniert:
Wie die komplette app beenden? - Android-Hilfe.de:

Will man per Knopfdruck generell die gesamte App schließen, egal wo man sich innerhalb der App befindet, also alle gerade evtl. im Hintergrund laufende Activities beenden, kann man das bequem über eine Hilfsaktivity managen.

Hier mal ein Beispielcode den ich hier gefunden habe: www.android-hilfe.de

ActivityRegistry.java:

```
public class ActivityRegistry {
  private static List<Activity> _activities;

  public static void register(Activity activity) {
    if(_activities == null) {
      _activities = new ArrayList<Activity>();
    }
    _activities.add(activity);
  }

  public static void finishAll() {
    for (Activity activity : _activities) {
      activity.finish();
    }
  }
}
```

und dann in jeder Activity folgendes unter "onCreate":

```
ActivityRegistry.register(this);
```

und in der Activity in der die App geschlossen werden soll folgendes:

```
@Override
public void onClick(View v) {
     switch (v.getId()) {
        case R.id.AppBeenden:
        ActivityRegistry.finishAll();
        break;
        }
}
```


----------

