# Umgang mit mehreren Activities



## Sen (6. Okt 2012)

Abend, ich arbeite gerade an den Activities und habe dabei folgendes problem:

Mit Hilfe von finish() kann ich meine Activity beenden. Leider ist meine App so aufgebaut:

Activity -> setContentView(View) -> View

Das ganze funktioniert ohne Schleife. Meine Activity hat noch onTouchEvent(MotionEvent event), damit etwas passiert. Problematisch ist aber folgendes: Auf View habe ich eigene Buttons gesetzt (also keine vorgefertigten) und beim klicken wird z.B. die Activity gewechselt und beim klicken eines anderen wird die App beendet.  Zum Beenden brauche ich finish, was aber nur in der Activity funktioniert, mit der ich aber nur durch onTouchEvent Kontakt habe. 

Ich versuchte bereits im Konstruktor von View die Activity mitzuliefern und ähnliches, aber das funktioniert nicht. Im Grunde könnte ich die App auch anderweitig beenden, aber wirklich problematisch ist, dass ich nun mal keinen Zugriff mehr auf die Activity habe. Wie macht das normalerweiße?



Das zweite Problem bezieht sich auf den Wechsel zwischen zwei Activities. Ich benutze dafür folgendes:
getContext().startActivity(new Intent(getContext(), Options.class));
Das funktioniert auch, aber der Rückwertsgang will nicht. Das selbe habe ich in Options reingebaut (class natürlich geändert) und die App freezed. Wenn ich Options durch ein einfaches finish() beende, dann freezed es nicht, bleibt aber schwarz und funktioniert somit auch nicht. Was mache ich falsch?



Ansonsten: Ich habe einige Bilder, die ich sowohl im Menu, wie auch später verwende. Diese erstelle ich durch:
Bitmap.createScaledBitmap(...);
Momentan habe ich die Variable dazu statisch gemacht und lade sie im Menu in diese Variable, womit das Bild dann überall verfügbar ist. Geht das so? Ich habe nähmlich Angst, wenn ich die Bilder jedesmal in der jeweiligen Klasse lade, dass dann der Speicher gefüllt wird.


----------



## schlingel (7. Okt 2012)

> Activity -> setContentView(View) -> View


Was soll das heißen?

Normalerweise programmiert man seine Activities so. Du schreibst dir im onCreate den Code der die ContentView setzt, die Referenzen auf die anderen Views holt (Buttons, etc.) und diese dann mit den EventHandlern verdrahtet. Das gehört schon so.

Prinzipiell ist es so: Wenn du auf einen bestimmten Knopfdruck alle Activities deiner App beenden willst, musst du eine jede einzelne Activity benachrichtigen. Die Frage die bleibt: Wofür brauchst du das? Es reicht vollkommen wenn du das System seine Arbeit machen lasst. Google hat sich schon was dabei gedacht hier kein Application.exit(); einzubauen.

Eine andere Möglichkeit wäre, über einen IPC Mechanismus jede Activity zu benachrichtigen. Ist aber sehr fehleranfällig.



> Das funktioniert auch, aber der Rückwertsgang will nicht. Das selbe habe ich in Options reingebaut (class natürlich geändert) und die App freezed.


Als Rückwärtsgang kannst du neben dem finish auch noch per startActivity die Activity aufrufen von vorhin. Wenn diese noch am Activity-Stack liegt wird keine neue instanziert sondern die wieder verwendet.



> Bitmap.createScaledBitmap(...);
> Momentan habe ich die Variable dazu statisch gemacht und lade sie im Menu in diese Variable, womit das Bild dann überall verfügbar ist. Geht das so?


Berechtigte Angst. Aber eine grausliche Lösung. An wie vielen Stellen verwendest du die Grafik? Wenn's leicht abzählbar ist, würde ich es einfach in eine SoftReference packen. Dann erledigt das System den Job Speicher freizugeben wenn es welchen braucht.


----------



## Sen (7. Okt 2012)

Das heißt letztendlich wirklich, dass ich die App nicht selbst beenden muss? Nett^^

Mir ist gerade etwas aufgefallen; Die nächste Activity braucht kein finish oder ähnliches. Durch klicken des Pfeils (ich kenne den Namen nicht) gelange ich zurück und es funktioniert. Ich habe nur etwas Bedenken, weil ich mit "getContext().startActivity(new Intent(getContext(), Options.class))" immer wieder einen neuen Intent erzeuge. Ist das schlimm?

Die Grafik verwende ich so ziemlich überall. Ich plane es so, dass sie sich nach und nach ändert und zwar überall. Ansonnsten probiere ich mal die SoftReference.


----------



## schlingel (7. Okt 2012)

> Das heißt letztendlich wirklich, dass ich die App nicht selbst beenden muss? Nett^^


Ganz genau: Grund dafür: Solange sich der Benutzer in deiner App bewegt, geht man davon aus, dass er immer wieder zurück zu der Activity kommen kann und es daher puncto Performance besser ist, wenn diese nicht jedesmal abgedreht wird.



> Ich habe nur etwas Bedenken, weil ich mit "getContext().startActivity(new Intent(getContext(), Options.class))" immer wieder einen neuen Intent erzeuge. Ist das schlimm?


Nein, überhaupt nicht.



> Die Grafik verwende ich so ziemlich überall. Ich plane es so, dass sie sich nach und nach ändert und zwar überall. Ansonnsten probiere ich mal die SoftReference.


Wenn's funktioniert - mach es so. Aber für Spiele wäre es sowieso klüger sich mal ein OpenGL Framework anzusehen. AndEngine wird hier im Forum gerne empfohlen, libgdx finde ich persönlich ganz nett und ansonsten gibt's genug andere.

Edit:/ Pfeilftaste = Back-Taste


----------



## Sen (7. Okt 2012)

Ich habe mir kurz OpenGL ES 2.0 angesehen und ich fand es sehr umständlich. Die Beispiele brauchen allesamt ca. 150 Zeilen+ um ein Triangle auf den Bildschirm zu bekommen und da ich im 2D Bereich bleiben möchte und Canvas derzeit schnell genug für ich ist, habe ich mich gegen OpenGL entschieden.

Von einer Engine möchte ich auch erst später gebrauch machen, da ich die kleinen Dinge lernen will


----------

