2017-07-25 4 views
1

Ich bin ein Anfänger mit Android.Android View - Was ist automatisch gespeichert und wiederhergestellt in Aktivität

In Android können einige generische Elemente automatisch in onSaveInstanceState/onRestoreInstanceState gespeichert/wiederhergestellt werden.

Zum Beispiel EditText Speichern/Wiederherstellen der Text-Eigenschaft, die Bewertungsleiste Bewertung Eigenschaft Speichern/Wiederherstellen ...

ich von einem Test zu sehen, aber ich kann nicht nichts darüber in der Dokumentation.

Meine Frage:

Wie kann ich wissen, was ohne mein Eingreifen gespeichert/wiederhergestellt wird?

Zum Beispiel, wo finde ich den EditText.Text wird automatisch gespeichert/wiederhergestellt?

Ich präzise ich will nicht alle Eigenschaften testen.

Bearbeiten von JRG Antwort:

https://developer.android.com/guide/components/activities/activity-lifecycle.html

Speichern Sie Ihre Aktivität Zustand Wie Ihre Aktivität, das System zu stoppen beginnt die onSaveInstanceState nennt() -Methode < ...> Die Umsetzung Standard dieser Methode speichert vorübergehende Informationen über den Status der Ansichtshierarchie der Aktivität , wie z. B. der Text in einem EditText-Widget oder die Bildlaufposition eines ListView wi dget.

Wie kann ich wissen, was die Standardimplementierung von Speichern/Wiederherstellen?

Zweite bearbeiten nach nachzulesen JRG Antwort:

Standardmäßig verwendet das System der Bundle Beispiel Zustandsinformationen über> jedes View-Objekt in Ihrer Tätigkeit Layout (wie der Text eingegebene Wert in> eine EditText zu speichern Widget).

Die Standardimplementierung speichert/stellt den gesamten Status der Elementansicht wieder her.

Antwort

2

Android-Dokumentation, die über das Speichern von Zuständen und einen sehr guten Artikel zum Speichern von Zuständen in Aktivität und Fragment erklärt.

Speichern und Wiederherstellen von Aktivitätszustand Es gibt einige Szenarien, in denen Ihre Aktivität aufgrund der normalen App Verhalten zerstört wird, wie zum Beispiel, wenn der Benutzer Drücken Sie die Zurück-Taste oder Ihre Aktivität signalisiert ihre eigene Zerstörung durch den Aufruf der finish() -Methode. Das System kann auch den Prozess mit Ihrer Aktivität zur Wiederherstellung von Speicher zerstören, wenn sich die Aktivität im Status Gestoppt befindet und lange Zeit nicht verwendet wurde oder wenn die Vordergrundaktivität mehr Ressourcen erfordert.

Wenn Ihre Aktivität zerstört wird, weil der Benutzer auf Zurück drückt oder die Aktivität sich selbst beendet, ist das Systemkonzept dieser Aktivitätsinstanz für immer verloren, da das Verhalten anzeigt, dass die Aktivität nicht mehr benötigt wird. Wenn jedoch das System die Aktivität aufgrund von Systemeinschränkungen (und nicht als normale App-Verhalten) zerstört, dann obwohl die tatsächliche Aktivität Instanz gegangen ist, erinnert das System, dass es existierte, so dass, wenn der Benutzer es navigiert zurück, legt das System einen neuen Instanz der Aktivität, die eine Gruppe gespeicherter Daten verwendet, die den Status der Aktivität bei deren Zerstörung beschreibt. Die gespeicherten Daten, die das System zum Wiederherstellen des vorherigen Status verwendet, werden als Instanzstatus bezeichnet und sind eine Sammlung von Schlüssel/Wert-Paaren, die in einem Bundle-Objekt gespeichert sind.

Standardmäßig verwendet das System der Bundle Beispiel Statusinformationen zu dem einzelnen View-Objekt in Ihrer Tätigkeit Layout (wie der Textwert eingegeben in ein EditText widget) zu speichern. So , wenn Ihre Aktivitätsinstanz zerstört und neu erstellt, wird der Zustand des Layouts in seinen vorherigen Zustand ohne Code gestellt, indem Sie benötigt. Ihre Aktivität verfügt jedoch möglicherweise über weitere Statusinformationen, die Sie wiederherstellen möchten, z. B. Elementvariablen, die den Fortschritt des Benutzers in der Aktivität protokollieren.

Speichern Sie Ihren Aktivitätszustand Wie Ihre Aktivität zu stoppen beginnt, ruft das System die onSaveInstanceState() -Methode, um Ihre Aktivität Zustandsinformation mit einer Sammlung von Schlüssel-Wert-Paaren zu speichern. Die Standardimplementierung dieser Methode spart transiente Informationen über den Zustand der Ansichtshierarchie Aktivität, wie der Text in einem EditText Widget oder die Bildlaufposition eines Listview-Widgets. Ihre Anwendung sollte die onSaveInstanceState() Callback nach dem onPause() -Methode, und vor OnStop() implementieren. Implementieren Sie diesen Rückruf nicht in onPause().

Vorsicht: Sie müssen immer die Superklassenimplementierung von onSaveInstanceState() aufrufen, damit die Standardimplementierung den Status der Ansichtshierarchie speichern kann.

Um zusätzliche Statusinformationen für Ihre Aktivität zu speichern, müssen Sie onSaveInstanceState() überschreiben und Schlüssel/Wert-Paare zum Bundle-Objekt hinzufügen, das für den Fall gespeichert wird, dass Ihre Aktivität unerwartet zerstört wird. Zum Beispiel:

static final String STATE_SCORE = "playerScore"; 
static final String STATE_LEVEL = "playerLevel"; 
... 


@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 


    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

Hinweis: Damit das Android-System den Zustand der Ansichten in Ihrer Aktivität wiederherzustellen, muss jede Ansicht eine eindeutige ID, die von dem Android geliefert: id-Attribut.

Um persistente Daten wie Benutzereinstellungen oder Daten für eine Datenbank zu speichern, sollten Sie geeignete Gelegenheiten ergreifen, wenn Ihre Aktivität im Vordergrund steht. Wenn keine solche Möglichkeit besteht, sollten Sie diese Daten während der onStop() - Methode speichern.

Wiederherstellen des Aktivitätszustand Wenn Ihre Aktivität neu erstellt wird, nachdem es zuvor zerstört wurde, können Sie Ihren gespeicherten Zustand aus dem Bundle, dass das System auf Ihre Aktivität passiert erholen können. Die Callback-Methoden onCreate() und onRestoreInstanceState() empfangen dasselbe Bundle, das die Instanzstatusinformationen enthält.

Da die onCreate() -Methode aufgerufen wird, ob das System eine neue Instanz Ihrer Aktivität erstellt oder eine vorherige erneut erstellt, müssen Sie überprüfen, ob der Status Bundle null ist, bevor Sie versuchen, sie zu lesen. Wenn es null ist, erstellt das System eine neue Instanz der Aktivität, anstatt eine vorherige Instanz wiederherzustellen, die zerstört wurde.

Zum Beispiel kann der folgende Code-Schnipsel zeigt, wie Sie einige Zustandsdaten in onCreate wiederherstellen():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 


    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
     // Probably initialize members with default values for a new instance 
    } 
    ... 
} 

Statt den Zustand während onCreate der Wiederherstellung() Sie onRestoreInstanceState implementieren können(), die das System nach der Methode onStart() aufruft. Das System ruft onRestoreInstanceState() nur dann, wenn es einen gesicherten Zustand ist wieder herzustellen, so brauchen Sie nicht zu überprüfen, ob das Bundle ist null:

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 


    // Restore state members from saved instance 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} 

Achtung: Immer die übergeordnete Klasse Implementierung von onRestoreInstanceState nennen (), so dass die Standardimplementierung den Status der Ansichtshierarchie wiederherstellen kann.

+0

Aus Ihrer Antwort, ich habe meine Frage bearbeitet. Danken. – Orwel

+0

Überprüfen Sie meine zweite Antwort mit mehr Details und Code, um zu erklären, welche Daten kostenlos gespeichert werden und welche Daten Sie codieren müssen! Wenn es erklärt, dann akzeptiere die Antwort und stimme ab! – JRG

+0

Mein schlechter, Sie antworten auf meine Frage. Danke JRG. – Orwel

0

Hier ist ein Beispiel, Ihnen zu erklären ...

  • was standardmäßig gespeichert wird und wie?
  • Für welche Daten müssen Sie Code hinzufügen, damit er gespeichert wird?
  • Ich habe ein einfaches Android-Projekt erstellt, das insgesamt 4 Datenpunkte hat, die zu irgendeinem Zeitpunkt im Lebenszyklus der App einen gewissen Wert haben werden.

    1. Aktivität interne Variable saveMe
    2. interne Aktivität variable saveMeNot
    3. Ansicht des EditText withid (hat android: id)
    4. Ansicht des EditText (hat keine android: id)

    Hier die ist Reihenfolge der Ereignisse gemäß den Screenshots.

    1. Starten Sie die Android App
    2. Klicken Sie auf SAVE Taste saveMe und saveMeNot die Werte für interne Variablen zu setzen. A Toast wird angezeigt, dass die Werte für beide Variablen gespeichert wurden.
    3. Geben Sie Text in den Text wie Hallo und Hallo. Dadurch wird der Text in dem Bearbeitungstext festgelegt.
    4. Drehen Sie den Bildschirm, d. H. Ausrichtung ändern. Folgendes wird passieren ....
    5. Android speichert die Werte aller Ansichten, die android:id in activity_main.xml definiert haben. Hier wird nur Hello als EditText gespeichert, wo Hello getippt ist, hat eine android:[email protected]+id/withId. Ein anderer EditText mit dem Text Hi wird von Android nicht automatisch gespeichert, da er android:id nicht enthält. Dies ist, was Sie kostenlos erhalten (vorausgesetzt, alle Ihre Ansichten haben android:id definiert). Wenn Sie über benutzerdefinierte Ansichten verfügen, die die Ansicht erweitern, wird auch android:id definiert.
    6. Android ruft onSaveInstanceState und onRestoreInstanceState auf, wodurch Sie den Status aller internen Aktivitätsvariablen speichern können.saveMe und saveMeNot. Sie müssten dafür codieren, sonst ist der Zustand verloren. Wie in meinem Beispiel habe ich den Status saveMe gespeichert und nicht für saveMeNot. Dies ist etwas, was Sie nicht kostenlos bekommen, d. H. Sie müssten dafür codieren.
  • Klicken Sie auf CLICK ME, um die Werte von saveMe und saveMeNot zu sehen und Sie werden sehen, sind nur saveMe Werte angezeigt, wie sie von Ihnen in onSaveInstanceState und abgerufene in onRestoreInstanceState
  • Reihenfolge der Schritte

    gespeichert wurde

    enter image description here

    Code

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="test.saveinstance"> 
    
        <application 
         android:allowBackup="true" 
         android:icon="@mipmap/ic_launcher" 
         android:label="@string/app_name" 
         android:roundIcon="@mipmap/ic_launcher_round" 
         android:supportsRtl="true" 
         android:theme="@style/AppTheme"> 
         <activity android:name=".MainActivity"> 
          <intent-filter> 
           <action android:name="android.intent.action.MAIN" /> 
    
           <category android:name="android.intent.category.LAUNCHER" /> 
          </intent-filter> 
         </activity> 
        </application> 
    
    </manifest> 
    

    MainActivity.java

    package test.saveinstance; 
    
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.Toast; 
    
    public class MainActivity extends AppCompatActivity { 
    
        // will save in bundle in onSaveInstanceState 
        private int saveMe; 
    
        // will not save in bundle in onSaveInstanceState 
        private int saveMeNot; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         // do some action that generates values for 
         // activity specific variables i.e. saveMe 
         // and saveMeNot 
         Button saveButton = (Button) findViewById(R.id.save); 
         saveButton.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           saveMe = 10; 
           saveMeNot = 20; 
           Toast.makeText(getApplicationContext(), "SAVED: saveMe: " + saveMe + ";saveMeNot: " + saveMeNot, Toast.LENGTH_LONG).show(); 
          } 
         }); 
    
         // will be used to display value of 
         // saveMe and saveMeNot after orientation 
         // changes. 
         Button button = (Button) findViewById(R.id.button); 
         button.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           Toast.makeText(getApplicationContext(), "DISPLAY: saveMe: " + saveMe + ";saveMeNot: " + saveMeNot, Toast.LENGTH_LONG).show(); 
          } 
         }); 
        } 
    
        @Override 
        protected void onSaveInstanceState(Bundle outState) { 
         // save saveMe in bundle 
         outState.putInt("saveMe", saveMe); 
         super.onSaveInstanceState(outState); 
         Log.d("TEST", "Saving saveMe in bundle during orientation change"); 
        } 
    
        @Override 
        protected void onRestoreInstanceState(Bundle savedInstanceState) { 
         super.onRestoreInstanceState(savedInstanceState); 
         // retrieve saveMe from bundle 
         saveMe = savedInstanceState.getInt("saveMe"); 
         Log.d("TEST", "Retrieving saveMe in bundle during orientation change"); 
        } 
    } 
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        tools:context="test.saveinstance.MainActivity"> 
    
        <EditText 
         android:id="@+id/withId" 
         android:layout_marginTop="30dp" 
         android:layout_width="match_parent" 
         android:layout_height="70dp" 
         android:gravity="center" 
         android:hint="Type Here (has android:id)" /> 
    
        <EditText 
         android:layout_below="@id/withId" 
         android:layout_marginTop="20dp" 
         android:layout_width="match_parent" 
         android:layout_height="70dp" 
         android:gravity="center" 
         android:hint="Type Here (doesn't have android:id)" /> 
    
        <Button 
         android:id="@+id/button" 
         android:layout_alignParentBottom="true" 
         android:layout_marginBottom="10dp" 
         android:text="Click Me" 
         android:layout_width="match_parent" 
         android:layout_height="50dp" /> 
    
        <Button 
         android:id="@+id/save" 
         android:layout_above="@id/button" 
         android:layout_marginBottom="10dp" 
         android:text="Save" 
         android:layout_width="match_parent" 
         android:layout_height="50dp" /> 
    
    </RelativeLayout> 
    
    +0

    Sorry, meine Frage ist nicht klar. Ein Beispiel. Ich möchte den 'Switch' benutzen. Ich öffne die Dokumentation: https://developer.android.com/reference/android/widget/Switch.html. Wo kann ich sehen, dass das gerettet/wiederhergestellt ist? – Orwel

    Verwandte Themen