Утилита instanceState для Android активирована во время обновления приложения?

В instanceState активности мы сохраняем Serializable (bundle.putSerializable). В отчете о сбое из Play Маркета мы увидели следующую трассировку стека:

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) 

Наш код запутан DexGuard. Похоже, что Android способен сериализовать класс, но не способен десериализовать класс.

Единственная причина, по которой мы сейчас можем думать, – это обновление приложения (через Play Store). Между версией класс изменяется (из-за Dexguard), что делает десериализацию невозможной.

Итак, мой вопрос: удаляет ли Android весь экземпляр приложения при обновлении приложения или нет?

Вы не должны включать пользовательские классы в сохраненный экземплярState, если есть вероятность, что эти классы изменятся (даже если это только DexGuard, перетасовывающие имена вокруг). Система сохраняет некоторую информацию о последних действиях и может попытаться повторно использовать ее при обновлении.

Насколько мне известно, единственное условие, при котором система восстанавливает состояние Activity, когда оно полностью разрушено, – это когда система должна была уничтожить эту активность для восстановления системной памяти. Во всех остальных случаях (принудительный процесс остановки, переустановка приложения, перезапуск устройства) состояние теряется.

Что касается переустановки, вы должны учитывать, что при установке новой версии приложения вы, вероятно, изменили или удалили одно или несколько действий, а состояние старых действий, вероятно, не может соответствовать состоянию новых. Предположим, например, что в одном приложении Activity у вас есть TextView с идентификатором «@ + id / my_text». Через несколько дней вы решите удалить TextView и присвоить id «my_text» другому представлению – например, Spinner: как система могла бы восстановить текст TextView в Spinner?

Intereting Posts
Класс Mock для приложений Android с использованием Robolectric в приложении с кинжалом 2 JPA и Android Служба Android не запускается с помощью теста JUnit Android Recyclerview Layoutmanager's onLayoutChildren вызывается при изменении содержимого элемента Создать ярлык для конкретной активности на главном экране Android – изображение в центре во всех разрешениях экрана Как проверить, добавлен ли нижний колонтитул в список? Файлы cookie не принимаются по мобильным данным, но получены с помощью Wi-Fi во время регистрации в android (устройство – sony xperia) Как применить цветной фильтр к представлению со всеми детьми Как легко генерировать звуки синтезаторов в Android? XML-ориентированные графические интерфейсы и производительность Как обновить платформенные платформы Android в безголовом Linux? Объединение модулей в Android Studio? Кордова Target Android Как получить имена всех таблиц, присутствующих в базе данных в Android SQL Lite