2015-09-14 11 views
10

Im instanceState einer Aktivität speichern wir ein Serializable (bundle.putSerializable). In einem Crash-Bericht aus dem Play Store sahen wir den folgenden Stack-Trace:Wird die Android-Aktivität instanceState während des App-Upgrades bereinigt?

Caused by: java.lang.ClassNotFoundException: o.ণ 
at java.lang.Class.classForName(Class.java) 
at java.lang.Class.forName(Class.java:308) 
at android.os.Parcel$2.resolveClass(Parcel.java:2373) 
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657) 
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782) 
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940) 
at android.os.Parcel.readSerializable(Parcel.java:2381) 

Unser Code von DexGuard verschleiert wird. Es sieht so aus, als könnte Android die Klasse serialisieren, aber die Klasse nicht deserialisieren.

Der einzige Grund, den wir derzeit denken können, ist ein Upgrade der App (über de Play Store). Zwischen der Version wird die Klasse geändert (wegen Dexguard), was eine Deserialisierung unmöglich macht.

Also, meine Frage ist: reinigt Android alle instanceState einer App während der Aktualisierung einer App oder nicht?

+0

Behandelt Ihre App jede spezielle Art von Absicht, z. durch Aufruf oder Bereitstellung eines internen 'Service'? – JimmyB

+0

Ja, wir haben einen internen Dienst, der mit einem Intent mit Bündelparametern gestartet wurde. Das Problem, das ich oben beschrieben habe, ist jedoch ein Problem innerhalb einer Aktivität. – userM1433372

+0

Irgendwelche Kommentare zu der Antwort? –

Antwort

1

Sie sollten keine benutzerdefinierten Klassen in den gespeicherten instanceState aufnehmen, wenn die Chance besteht, dass sich diese Klassen ändern (selbst wenn nur Namen von DexGuard gemischt werden). Das System behält einige Informationen über kürzlich durchgeführte Aktivitäten bei und versucht möglicherweise, diese bei Upgrades wiederzuverwenden.

+0

Ist das Ihre Erfahrung oder haben Sie dies in der Dokumentation gefunden? – userM1433372

+0

Also sollten Sie putSerializable() niemals in einem Intent-Parameter-Paket mit Ihren eigenen Klassen verwenden? – userM1433372

+0

"wenn es eine Chance gibt, dass sich diese Klassen ändern". Betrachten Sie es als eine externe API Ihrer App, wenn Sie es ändern - Dinge könnten brechen. Ich fand es in internen Ressourcen, ich glaube nicht, dass die öffentliche Dokumentation diese Situation besonders hervorhebt. –

1

Soweit ich weiß, ist die einzige Bedingung, unter der das System den Zustand einer Aktivität wiederherstellt, wenn es vollständig zerstört wird, wenn das System diese Aktivität zerstören musste, um den Systemspeicher wiederherzustellen. In allen anderen Fällen (Erzwingen des Prozesses zum Stoppen, Neuinstallation der App, Neustart des Geräts) geht der Zustand verloren.

Über die Neuinstallation müssen Sie berücksichtigen, dass Sie bei der Installation einer neuen Version der App wahrscheinlich eine oder mehrere Aktivitäten geändert oder entfernt haben und der Status der alten Aktivitäten wahrscheinlich nicht mit dem Status der neuen Aktivitäten übereinstimmt . Angenommen, Sie haben in einer Activity-App eine TextView mit der ID "@ + id/my_text". Nach ein paar Tagen beschließen Sie, das TextView zu entfernen und die ID "my_text" einer anderen Ansicht zuzuordnen - zum Beispiel einem Spinner: Wie könnte das System den Text der TextView in einem Spinner wiederherstellen?

Verwandte Themen