2010-03-14 17 views
14

Mam małą aplikację testową, nad którą pracuję, która ma zegar, który aktualizuje widok tekstowy do odliczania od 100 do 0. To działa dobrze, ale teraz próbuję wstrzymać aplikację, jeśli użytkownik naciśnie przycisk przycisk Wstecz w telefonie, a następnie ponownie uruchom programator od miejsca, w którym zostały przerwane po ponownym otwarciu aplikacji. Oto kod używam:onPause/onResume problemy z aktywnością

@Override 
public void onPause() 
{ 
    if(this._timer_time_remaining > 0) { 
     this.timer.cancel(); 
    } 
    super.onPause(); 
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining)); 
} 

@Override 
public void onResume() 
{ 
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining)); 

    if(this._timer_time_remaining > 0) { 
     start_timer(this._timer_time_remaining); 
    } 
    super.onResume(); 
} 

Sposób start_timer() tworzy CountDownTimer który aktualizuje TextView w metodzie onTick i aktualizuje zmienną this._timer_time_remaining int.

CountDownTimer i _timer_time_remaining są zarówno uznane na poziomie klasy jak ten:

private CountDownTimer timer; 
private int _timer_time_remaining; 

Z Log.v (wydruków) widzę, że zmienna _timer_time_remaining posiada odpowiednią liczbę sekund zapisanych gdy OnPause nazywa, ale jest ustawiony ponownie na 0, gdy uruchamiany jest onResume. Dlaczego zmienna zostaje zresetowana? Myślałem, że aplikacja będzie działała w tle z tymi samymi wartościami. Czy czegoś brakuje? Wszystko to jest zadeklarowane w klasie, która rozszerza działanie.

Z góry dziękuję!

Uwaga: Pod oczyścić kopiowanie kodu

Odpowiedz

16

Jeśli spojrzeć na wykresie dla Activity lifecycle zdasz sobie sprawę, że nie ma gwarancji, o tobie aktywny po OnPause jest tzw. Android może zabić Cię Aktywność, nawet bez wywoływania Dezonu. Musisz zapisać swój stan za pomocą onSaveInstanceState i przywrócić go za pomocą onRestoreInstanceState.

This może być przydatny.

EDYTOWANIE:

Cykl życia obejmuje różne scenariusze. Jeśli masz tylko jedną Aktywność naciśnięcie Wróć jest równoznaczne z wyjściem z aplikacji. Jeśli posiadasz Aktywność A, która rozpoczyna aktywność B, wówczas wywoływana jest funkcja onSaveInstanceState dla Aktywności A. Po ponownym naciśnięciu w Aktywności B po prostu wychodzi i onRestoreInstanceState jest wywoływana dla Aktywności A. Próbujesz zapisać dane pomiędzy dwoma odrębnymi przebiegami Twojej aplikacji i do tego celu trzeba użyć pewnego rodzaju persistent storage.

+0

Po pierwsze, dziękuję za odpowiedź. Wymieniłem moją metodę onPause na metodę onSaveInstanceState (Bundle savedInstancestate), ale nie wydaje się, że zostanie ona wywołana po naciśnięciu przycisku Wstecz, aby opuścić aplikację. Żaden z moich komunikatów LogCat się nie wyświetla, więc nie sądzę, żeby w ogóle się do tego zwracano. Czy potrzebuję opcji onPause i onSaveInstanceState? A może powinien to zrobić onSaveInstanceState? – Blather

+0

Dokumentacja wyjaśnia to: "Jeden z przykładów wywołania funkcji onPause() i onStop(), a nie tej metody, gdy użytkownik przechodzi z działania B do działania A: nie ma potrzeby wywoływania metody onSaveInstanceState (pakiet) na B, ponieważ konkretna instancja nigdy nie zostanie przywrócona, więc system unika jej wywoływania. " Naciśnięcie przycisku Wstecz nie wywołuje metody SaveSstanceState, ale naciśnięcie przycisku Home powoduje. –

+0

Dzięki za odpowiedź. Widziałem, że wspomniano, ale jeśli onSaveInstanceState nie zostanie wywołany po naciśnięciu przycisku Wstecz, to nie zajmie się moim problemem, prawda? Chcę tylko, aby licznik odliczania zatrzymał się po naciśnięciu przycisku Wstecz, a następnie ponownie uruchom z tej samej lokalizacji, gdy aplikacja zostanie ponownie uruchomiona z ekranu głównego. Być może nie rozumiem, ale wydaje się, że to się nie uda. Jeszcze raz dziękuję za czas poświęcony na pomoc. Po prostu coś tu pomijam. – Blather

0

Możesz po prostu napisać limit czasu do bazy danych lub pliku w trybie onPause i odczytać go ponownie w onResume.

1

Nie jestem ekspertem od Androida, ale tylko z informacją, jak się spodziewać timer zachowywać

this.timer.cancel(): - byłoby anulować timer, ale nie wstrzymać

start_timer(this._timer_time_remaining): - czy „restart "timer, nie kontynuuj od ostatniej pozycji.

To, co widzisz, jest poprawne. Za każdym razem, gdy czas zaczyna się od nowa. Dowiedz się, co to jest api, aby zatrzymać stoper (jeśli jest).

0

Możesz również spróbować odsłuchania naciśnięć klawiszy (onKeyDown()), aby przechwycić przycisk Wstecz i zapisać dane w tabeli SQLite.

2

ten sposób chciałbym zapisać wartość: (cztery linie kodu)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
SharedPreferences.Editor edit = example.edit(); 
edit.putInt("time_remaining", (Integer)this._timer_time_remaining); 
edit.commit(); 

Po wznowieniu to zrobić: (Dwie linie kodu)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
int time_remaining = example.getInt("time_remaining", 0); 

ja przystosowane to od niektórych z mojego działającego kodu, ale nie przetestowałem go dokładnie w tym formacie. Wyszukaj dokumentację dla sharedPreferences, aby dowiedzieć się, jak to działa.