2013-05-30 11 views

Odpowiedz

14

Jeśli Android zabija proces hostingu aplikacji, to nadal utrzymuje „zapisany stan instancji "wszystkich aktywnych (nieukończonych) działań. Te dane są przechowywane przez ActivityManager. Jeśli użytkownik powróci do aplikacji, Android utworzy nowy proces dla aplikacji, ponownie utworzy instancję Application, a następnie utworzy instancję najwyższego działania w stosie działań. Następnie wywoła on onCreate() dla tej instancji działania, przekazując mu "zapisany stan wystąpienia", który został ostatnio zapisany dla tego działania.

Po ponownym uruchomieniu telefonu wszystkie te dane zostaną utracone (system Android nie zapisze stanu aplikacji po ponownym uruchomieniu).

+5

Od API 21 'savedInstanceState' może przetrwać restart po ustawieniu na [persistableMode] (https://developer.android.com/reference/android/R.attr.html#persistableMode). "Pakiet" zostanie przekazany do [onCreate (Bundle, PersistableBundle)] (https://developer.android.com/reference/android/app/Activity.html#onCreate (android.os.Bundle% 2C% 20android.os .PersistableBundle)) jako drugi parametr – passsy

+0

, ponieważ @passsy zwrócił uwagę, że jest przeciążona nowa metoda 'onSaveInstanceState ', przyjmująca parametr' PersistableBundle' jako dodatkowy parametr, jeśli zastanawiasz się, dlaczego twoje 'onSaveInstanceState' nie zostanie wywołane, możesz użyć nowej metody . –

6

Nie będzie, aplikacja na Androida będzie działać tak długo, jak długo będzie działać: (pierwszy plan i tło).

Jeśli szukasz czegoś, co może obejmować różne okresy użytkowania aplikacji, użyj czegoś takiego jak SharedPreferences.

chodzi

jeśli system zabija proces aplikacji i użytkownik przechodzi z powrotem do aktywności

Dzieje się tak tylko gdy jest android pamięci potrzeb i zabić swoją aktywność do wolnych zasobów i twoi aktywność w stosie działań. udokumentowane, że jest to wygodny sposób na utrzymanie wygody użytkownika.

android dokumentacje:

Czynność tła (działalność, która nie jest widoczna dla użytkownika i została wstrzymana) nie jest krytyczna, więc system może bezpiecznie zabić jego proces odzyskania pamięci innym planie lub widoczne procesy. Jeśli jego proces musi zostać zabity, gdy użytkownik przejdzie z powrotem do działania (co spowoduje, że będzie znowu widoczny na ekranie), jego metoda onCreate (android.os.Bundle) zostanie wywołana z zapisaną wartościąInstanceState, którą wcześniej dostarczono on onSaveInstanceState (Android .os.Bundle)

, dzięki czemu może się ponownie uruchomić w tym samym stanie, w którym użytkownik ostatnio go zostawił.

, więc nie powinieneś oczekiwać, że instanceState będzie utrzymywane przez cały czas. Activity source code at codegrep

Edit

przeszukując google android instance state Przyszedłem przez tego zasobu Android Recreating an Activity

Gdy działalność jest zniszczone, ponieważ użytkownik naciśnie Wstecz lub aktywność kończy się, koncepcję systemową ta instancja działania zniknęła na zawsze, ponieważ zachowanie wskazuje, że działanie nie jest już potrzebne. Jeśli jednak system niszczy aktywność z powodu ograniczeń systemowych (zamiast normalnego zachowania aplikacji), to mimo że faktyczna instancja działania zniknęła, system zapamiętuje, że istniał tak, że jeśli użytkownik nawiguje z powrotem do niego, system tworzy nowy wystąpienie działania przy użyciu zestawu zapisanych danych opisującego stan działania po jego zniszczeniu. Zapisane dane, które system wykorzystuje do przywrócenia poprzedniego stanu, nazywa się "stanem instancji" i jest zbiorem par klucz-wartość przechowywanych w obiekcie Bundle.

Edycja 2 Po wykopaniu około android wewnętrznych, wydaje się, że to wszystko jest o ActivityManagerNative

Kiedy działalność jest wstrzymanie jego stan jest przekazywany Korzystanie z działki sprzeciw wobec procesu ActivityManager.

public void activityPaused(IBinder token, Bundle state) throws RemoteException 
{ 
    Parcel data = Parcel.obtain(); 
    Parcel reply = Parcel.obtain(); 
    data.writeInterfaceToken(IActivityManager.descriptor); 
    data.writeStrongBinder(token); 
    data.writeBundle(state); 
    mRemote.transact(ACTIVITY_PAUSED_TRANSACTION, data, reply, 0); 
    reply.readException(); 
    data.recycle(); 
    reply.recycle(); 
} 

A gdy ActivityManagerNative tworzy aktywność, przechodzi to państwo z powrotem do aktywności przy użyciu Parcel

public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 
     throws RemoteException { 
    switch (code) { 
    case START_ACTIVITY_TRANSACTION: 
    { 
     data.enforceInterface(IActivityManager.descriptor); 
     IBinder b = data.readStrongBinder(); 
     IApplicationThread app = ApplicationThreadNative.asInterface(b); 
     Intent intent = Intent.CREATOR.createFromParcel(data); 
     String resolvedType = data.readString(); 
     Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR); 
     int grantedMode = data.readInt(); 
     IBinder resultTo = data.readStrongBinder(); 
     String resultWho = data.readString();  
     int requestCode = data.readInt(); 
     boolean onlyIfNeeded = data.readInt() != 0; 
     boolean debug = data.readInt() != 0; 
     int result = startActivity(app, intent, resolvedType, 
       grantedUriPermissions, grantedMode, resultTo, resultWho, 
       requestCode, onlyIfNeeded, debug); 
     reply.writeNoException(); 
     reply.writeInt(result); 
     return true; 
    } 
    ..... 
+1

Dokumentacja mówi: 'Wtedy, jeżeli system zabija proces aplikacji i użytkownik przechodzi z powrotem do aktywności, system odtwarza działalność i przechodzi wiązka zarówno onCreate() i onRestoreInstanceState() "Czy coś mi brakuje? – Eugene

+0

Istnieje również dobre wytłumaczenie, że stan instancji jest zapisywany, gdy aplikacja jest zabijana.https: //www.youtube.com/watch? V = fL6gSd4ugSI & feature = youtube_gdata_player – Eugene

+0

"Kiedy twoja aktywność zostanie zniszczona, ponieważ użytkownik naciśnie przycisk Wstecz lub aktywność zostanie zakończona sama koncepcja systemu tej instancji Activity zniknęła na zawsze, ponieważ zachowanie wskazuje, że działanie nie jest już potrzebne. " Szukałem tego, dzięki! –

0

Poniższa tabela z jednego z materiałów szkoleniowych z systemu Android może być bardziej pomocna.

W tym pakiecie zapisanym przez onSavedInstanceState jest ważne, gdy aplikacja jest OTWARTA, co oznacza, że ​​aplikacja może być PAUSed, a nawet STOP i ZNISZCZONY (z przyczyn takich jak obrót), ale NIE WYDAWA, używając przycisku Wstecz.

Tabela pokazuje również inne dostępne opcje, jeśli nie jest to onSavedInstanceState.

enter image description here

Powiązane problemy