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

Wann Daten speichern, wenn Programm beendet wird?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GMoN, 20.04.2009.

  1. GMoN, 20.04.2009 #1
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Android bringt mich gerade zur Verzweiflung.

    Und zwar möchte ich, bevor der User das Programm mit dem Back Button die Anwendung beendet, die gesammelten Daten in eine Textdatei speichern. Wo und wann muss ich die Speicher Methode aufrufen? Das Problem ist, dass Speichern dauert ca. 6 Sekunden, es sind also mehrere MB, die auf die SD geschrieben werden müssen. Ich habe es in onDestroy, onStop und onPause versucht. Alle drei werden aber i.d.R. vorzeitig von Android beendet, Android wartet mit dem Schließen meiner Activity also nicht, bis das File auf die SD Karte geschrieben ist. So ist es dann meist nur 0 Byte groß:(

    Wie fange ich den diesen Back Button ab um vorher in Ruhe speichern zu können?
     
  2. Markus, 21.04.2009 #2
    Markus

    Markus Gewerbliches Mitglied

    Beiträge:
    76
    Erhaltene Danke:
    8
    Registriert seit:
    19.01.2009
    Aber nicht doch! ;)

    Die normale Vorgehensweise wäre bei onPause zu speichern. Nur hier ist gewährleistet, dass die Methode aufgerufen wird. Bei 6 Sekunden Speichervorgang hätte ich eher erwartet, dass Android einen Dialog zum Beenden der Aktivität aufpoppt, weil es länger als erwartet dauert. Aber ausprobiert habe ich das nicht. Bist Du sicher, dass dein Save tatsächlich funktioniert? Mal reindebuggt?

    Andere Frage: Warum streamst Du deine Daten nicht gleich in das File sobald neue Daten verfügbar werden? Wenn ich deine App richtig verstanden habe, sollte das gehen?

    Im View onKeyDown implementieren und im Falle vom Back true zurückgeben.
     
  3. joschika77, 01.07.2009 #3
    joschika77

    joschika77 Android-Hilfe.de Mitglied

    Beiträge:
    129
    Erhaltene Danke:
    1
    Registriert seit:
    26.05.2009
    Ich habe dazu mal eine ähnliche Frage. Wenn die onStart() aufgerufen wird, wird kurz danach die onResume() aufgerufen & beim zurück Button die wird die onPause() & danch die onDestroy(), ist das normal? Also eigentlich interessiert mich nur letzteres. Wird die Activity immer zerstört? Kann doch nicht sein. :confused:
     
  4. GMoN, 01.07.2009 #4
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Doch, ist nur ne Frage der Zeit. Mit dem Back Button schickst die Activity in den Hintergrund, genau wie mit dem Home Button. Und damit signalisierst Du Android, dass sie nicht mehr interessant ist. onPause kommt dabei sofort. der oom_adj geht dann hoch und je nachdem ob andere Activities jetzt viel Speicher brauchen entscheidet Android, wann onDestroy kommt und damit der Speicher komplett freigegeben wird.

    Android geht davon aus, dass in Activities eigentlich nur die GUI drin ist und die braucht ja nicht im Speicher zu bleiben, wenn man sie eh garnicht mehr sieht.

    Wenn Deine App auch noch was machen soll, während sie im Hintergrund ist, musst du dies zwangsläufig in einen Service auslagern. Das ist eine Besonderheit an Android, die man erstmal verstehen muss. Ich habe mich da auch lange vor gewehrt, da ich dies von Symbian so radikal auch nicht kannte. Aber da führt kein Weg dran vorbei.
     
  5. joschika77, 01.07.2009 #5
    joschika77

    joschika77 Android-Hilfe.de Mitglied

    Beiträge:
    129
    Erhaltene Danke:
    1
    Registriert seit:
    26.05.2009
    Gelesen hab ich von den Services auch schon. Werd ich wohl nicht dran vorbei kommen. Eine Frage hab i dazu noch. Ich muß immer in den überschriebenen Methoden das super... aufrufen sonst gibts ne Exception. Soll/Muß das so mit dem super?

    Code:
        public void onStop()
        {
            Log.i(TAG,"onStop");        EGlobals.ShowMessage(main.this,"onStop",Toast.LENGTH_SHORT,Gravity.BOTTOM,0,0);
            super.onStop();
        }
    
     

Diese Seite empfehlen