1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

onDestoy() richtig implementieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Duckemai, 02.11.2010.

  1. Duckemai, 02.11.2010 #1
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    @first: Sorry für den Schreibfehler - onDestroy()

    Hallo zusammen,

    ich habe ein App geschrieben, über das dem User mittels Menü und eines 2tes Activity (Preference) eine Listenauswahl gezeigt wird. Nun möchte ich dem User ersparen, nach der Auswahl, die Rücktaste drücken zu müssen. Dies soll automatisch geschehen.

    Dafür habe ich in der onCreate der Preference folgendes gemacht:

    public void onCreate(Bundle savedInstanceState) {
    ...
    customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference Preferences,
    Object customPref) {
    Intent i = new Intent(Preferences.this, Hauptaktivity.class);
    startActivity(i);
    return true;
    ...
    }

    Das klappt auch. Aber natürlich wird die Preference nicht ordungsgemäß beendet. Wie baut man die onDestroy() hier richtig ein?

    this.onDestroy() klappt nicht.

    Wenn ich sie anschließend überschreibe mit:
    @Override protected void onDestroy() {
    super.onDestroy();
    }
    erfolgt kein Aufruf der Methode, da er vorher rausgeht.

    Hat jemand einen praktischen Rat für mich, wie sowas geht
    oder ein Code-Bsp. um das mal zu sehen?

    Vielen Dank
    Duckemai
     
  2. Duckemai, 03.11.2010 #2
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Lösung: finish().
    Tja, so einfach kann das Leben sein. In der Programmierung eher ungewöhnlich ;-)
     
  3. ko5tik, 03.11.2010 #3
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Es ist nicht garantiert, das onDestroy() tatsächlich aufgerufen wird - ergo, man implementiert es gar nicht und gibt die Resources im onPause() frei :)
     
  4. Duckemai, 04.11.2010 #4
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Wie würdest Du das Programm aufbauen?

    onPause()
    und danach
    finish()

    Wäre das Activity dann sicher beendet?
     
  5. ko5tik, 04.11.2010 #5
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    onPause() bedeutet das deine Aktivität gleich aus dem Blick von der Benutzer verschwindet (und eventuell nicht wieder angezeigt wird) - das ist der einzige Callback
    der garantiert ist - also, allles unnutzes freigeben, Threads anhalten, Zustand speicher usw.

    finish() rufst du selbst auf, wenn deine Aktivität den Benutzer nicht mehr mag und gehen will (vorher bitte aufräumen) ;)
     
    Duckemai bedankt sich.
  6. Bladefs, 05.11.2010 #6
    Bladefs

    Bladefs Fortgeschrittenes Mitglied

    Beiträge:
    355
    Erhaltene Danke:
    11
    Registriert seit:
    01.06.2010
    Phone:
    LG G4
    Tablet:
    LG GPad 8.3, Nvidia Shield K1
    Hi Leute,

    ich möchte meine (selbstegschrieben) Apps richtig beenden.
    Bei java geht das ja mit System.exit(0) bei Android anscheinend mit finish().

    So weit so gut.

    Jetzt lese ich aber immer, das man die Ressourcen noch aufräumen muss (onDestroy(), isFinishing()) Oder wie darf ich mir das vorstellen.

    Hier mal meine Methode, die das Prog schließen soll und auch alles freigeben soll:
    Code:
    public void schließen(){
    		this.finish();
    	}
    Kann die bitte mal einer richtig vervollständigen?

    Und dann noch die Sache: Wie ruf ich diese Methode auf, wenn jem. den Homebutton drückt?

    Danke vielmals!
     
  7. Fr4gg0r, 05.11.2010 #7
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    public void onStop(){
    super.onStop();
    schließen();
    }

    Du solltest zb dafür sorgen, dass eventuelle Threads beendet werden, diese werden munter weiter ausgeführt, genauso wie Runnables.
     
  8. ko5tik, 05.11.2010 #8
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    ... es ist aber nicht sichergestellt, das diese Methode tatsächlich von Framework aufgerufen wird
     
  9. ko5tik, 05.11.2010 #9
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    ... System.exit() ist eine sehr sehr schlechte Idee. (bis auf sehr seltene Ausnahmen)

    Du sollst vor allem CPU freigeben (Threads anhalten), sockets und Dateien schliesen usw. Das gehört in onPause()



    Gar nicht. Wenn HOme-Button gedruckt wird, wird onPause() aufgerufen
    Dort sollltest du alle Threads anhalten die du eventuell getartet hast, und
    aktuellen zustand speichern - anssonsten soll die Anwendung bereit sein
    in onResume() wieder schnell vollen Fahrt aufzunehmen (zum Beispiel, ich habe ganz schnell neuen Tweet gelesen, und jetzt will ich weiter spielen -
    da wo ich aufgehört habe.
     
  10. Bladefs, 05.11.2010 #10
    Bladefs

    Bladefs Fortgeschrittenes Mitglied

    Beiträge:
    355
    Erhaltene Danke:
    11
    Registriert seit:
    01.06.2010
    Phone:
    LG G4
    Tablet:
    LG GPad 8.3, Nvidia Shield K1
    Hi, danke für die Antworten.

    Sockets und Threads habe ich noch keine, ich steck noch in den Anfängen (sind nur kleine Soundboards)

    Auf gut Deutsch, ich mach mein schließen mit this.finish() und brauch dann für den Home button noch n onPause() (gibts vom System) und da pack ich nommal das schliesen() rein.

    Aber für was ist das super.onstop() kapier das in dem Doc nicht so ganz ...

    Danke
     
  11. Fr4gg0r, 05.11.2010 #11
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Falls du zu faul bist, Threads sauber auslaufen zu lassen, dürfte es auch das hier tun: :D

    android.os.Process.killProcess(android.os.Process.myPid());
     
  12. Bladefs, 05.11.2010 #12
    Bladefs

    Bladefs Fortgeschrittenes Mitglied

    Beiträge:
    355
    Erhaltene Danke:
    11
    Registriert seit:
    01.06.2010
    Phone:
    LG G4
    Tablet:
    LG GPad 8.3, Nvidia Shield K1
    Ich weis nicht ob ich zu faul bin,

    ich hab einfach kp wie ich den auslaufen lassen sollten (zumal ich keine THreats verwende ;))

    will einfach nur mein Programm beenden :p

    hilfts was, wenn ich den ganzen source code schicke?
     

Diese Seite empfehlen