2014-06-09 11 views
9

Próbuję przetestować metodę onRestoreInstanceState i kiedy (dokładnie) jest wywoływana. Dlatego wykonałem następujące kroki:Dlaczego usługa onRart nie jest wywoływana onRestoreInstanceState?

  1. rozpocznij moją działalność. onCreate -- > onStart --> onResume zostały wywołane.
  2. naciśnij przycisk Home na emulatorze. onPause --> onSaveInstanceState --> onStop zostały wywołane.
  3. Kliknij ikonę w programie uruchamiającym i ponownie uruchom moją aktywność. onRestart --> onStart --> onResume zostały wywołane.

Mój kod Java:

package com.test.demostate.app; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 


public class MainActivity extends ActionBarActivity { 
    private int visiters=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("TAG","onCreate"); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("TAG","onPause"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("TAG","onStop"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("TAG","onStart"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("TAG","onRestart"); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     visiters++; 
     Log.d("TAG","onResume"); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("visiters",visiters); 
     Log.d("TAG",visiters+" visiters was saved "); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     visiters=savedInstanceState.getInt("visiters"); 
     Log.d("TAG",visiters+" visiters was restored"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("TAG","onDestroy"); 
    } 
} 

Od docs: Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method .

Więc onRestoreInstanceState nazywa

  • po działalność została zniszczona onPause --> onStop --> onDestroy następnie onCreate --> onRestoreInstanceState --> onResume (ze względu na obracanie ekranu dla przykład)
  • po zatrzymaniu aktywności onPause --> onStop --> onRestart --> onStart --> onRestoreInstanceState --> onResume (ze względu na naciśnięcie ikony domu)

Ale dlaczego nie jest wywoływana po onStart?

Dzięki

+0

"..który system wywołuje * po * metodzie onStart()." - Proszę napisać tytuły związane z problemem. – user2864740

+0

@ user2864740, tytuł mojego pytania został zmieniony "Dlaczego nie jest ..." –

+0

Po kroku drugim, naciśnij ponownie przycisk home i kliknij otwartą aplikację. Spróbuj także uruchomić aplikację na smartfonie. –

Odpowiedz

1

Po onStart() tylko jeśli onSaveInstanceState() została wywołana.

Z dokumentów:

Metoda ta jest wywoływana po onStart(), gdy działanie to jest ponownej inicjalizacji z wcześniej zapisanego stanu, podane tu w savedInstanceState. Większość implementacji po prostu użyje onCreate (Bundle), aby przywrócić ich stan, ale czasami jest to wygodne, aby zrobić to tutaj po przeprowadzeniu całej inicjalizacji lub zezwolić podklasom na podjęcie decyzji, czy użyć domyślnej implementacji . Domyślna implementacja tej metody powoduje odtworzenie dowolnego stanu widoku, który został wcześniej zamrożony przez onSaveInstanceState (pakiet).

Ta metoda jest wywoływana między onStart() i onPostCreate (pakiet).

Activity#onRestoreInstanceState()

+0

ok understand. W moim kodzie wywołałem zarówno onSaveInstanceState, jak i onRestoreInstanceState. I testowałem, jeśli onRestoreInstanceState został wywołany z metodą Log.d Ale nic nie jest wyświetlane (korzystam z android studio 0.5.2) –

+0

@JamesDaniel Czy zapisałeś dowolny stan podczas przesłonięcia 'onSaveInstanceState()'? –

+0

yes @ Code-Apprentice i możesz zobaczyć mój kod java –

1

Oficjalna dokumentacja mówi o onRestoreInstanceState (Bundle savedInstanceState):

Metoda ta jest wywoływana po onStart() gdy działalność jest ponownie zainicjowany z wcześniej zapisanego stanu , podane tutaj w savedInstanceState.Większość implementacji po prostu użyje onCreate (Bundle), aby przywrócić ich stan, ale czasami jest to wygodne, aby zrobić to tutaj po przeprowadzeniu całej inicjalizacji lub zezwolić podklasom na podjęcie decyzji, czy użyć domyślnej implementacji . Domyślna implementacja tej metody powoduje odtworzenie dowolnego stanu widoku, który został wcześniej zamrożony przez onSaveInstanceState (pakiet).

Ta metoda jest wywoływana między onStart() i onPostCreate (pakiet).

Kiedy aktywność została ponownie zainicjowana?

  • Po zmianie orientacji urządzenia aktywność użytkownika zostaje ponownie zainicjowana.
  • Jeśli przed aplikacją jest inna aktywność, a system operacyjny z jakiegoś powodu zabija twoją aplikację, mogą to być na przykład darmowe zasoby.

Spróbuj zmienić orientację emulatora:

Ctrl + F12

wyglądać answer z użytkownikiem @GAThrawn

Naciśnięcie przycisku Home zostawić swoją aplikację i przejdź do ekranu głównego, , pozostawiając aplikację działającą w tle. To trochę tak, jak przełączanie między oknami na komputerze z systemem Windows.

Tyle, że gdy telefon zaczyna brakować zasobów jak pamięć to zacznie się zamykać aplikacje, które są uruchomione w tle, dzięki czemu telefon ma wystarczającą ilość środków na to, co próbujemy zrobić teraz. Gry są często jedną z pierwszych aplikacji, które telefon "zabije", aby zaoszczędzić zasoby , ponieważ często używają o wiele więcej pamięci i procesora niż inne aplikacje. Dlatego czasami Twoja gra jest nadal wstrzymana, a czasami Android ją zamknął.

Więc nie mogę udowodnić moją drugi argument, gdyż decyduje to OS, przynajmniej nie wiem jak to udowodnić.

+0

właśnie udowodniłeś pierwszą sugestię (po tym, jak działanie zostało zniszczone) i to jest w porządku. Ale co powiesz na drugą sugestię (po tym, jak działalność została zatrzymana bez zniszczenia)? –

+0

Edytowałem swoją odpowiedź, spójrz. Przyjmij moją odpowiedź, jeśli była dla niego przydatna i uleczyła twoje pytanie. –

+0

Spróbuj nacisnąć przycisk Home i zabić aplikację, po ponownym otwarciu aplikacji sprawdź, czy to dowodzi mojej drugiej argumentacji. –

Powiązane problemy