Андроид - почему через onSaveInsanceState() для сохранения растрового объекта не вызывается?
Я делаю простое приложение для рисования.
Я хочу иметь возможность сохранять рисунок пользователя на экране при изменении ориентации устройства. Это происходит только в основной деятельности.
Я читал, что если ориентация меняется, то активность уничтожается и воссоздается снова (onCreate(Bundle created)
называют).
Я не уверен, означает ли это, что он также должен позвонить onSavedInstanceState(Bundle bundle)
, потому что в моем приложении он вызывается только в том случае, если другое действие фокусируется поверх моей основной деятельности, но не при повороте в ландшафт/портрет.
Я просто ищу способ сохранить существующее растровое изображение и передать его в основное действие при изменении ориентации. Как я могу это сделать, если мой onSaveInstanceState
никогда не вызывается?
кроме того, поскольку Bitmap реализует parceable
Я уже использовал его.
вот код из основной деятельности:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// some more activity code...
if (savedInstanceState != null) {
bitmap = savedInstanceState.getParcelable("bitmap");
Log.d("STATE-RESTORE", "bitmap created");
paintBoard.setBitmapBackground(bitmap, false);
Log.d("RESTORING...", "onRestoreInstanceState()");
} else {
Log.d("SavedInstanceState", "null");
}
}
// Never called when I change orientation on my device
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitmap = Bitmap.createBitmap(paintBoard.getBitmap());
outState.putParcelable("bitmap", bitmap);
Log.d("STATE-SAVE", "onSaveInstanceState()");
}
любая помощь будет оценили.
EDIT:
Я удалил эту строку из AndroidManifest.xml-файл:
android:configChanges="orientation"
и теперь onSaveInstanceState()
вызывается, когда я меняю ориентацию на устройстве.
4 ответов
сохраните растровое изображение в onPause()
или onDestroy()
потому что я думаю onSavedInstanceState()
никогда не вызывается системой android при переключении ориентации.
следует читать в этой статье полностью.
...Возможно, вам не удастся полностью восстановить состояние активности с пакетом, который система сохраняет для вас с помощью
onSaveInstanceState()
callback - он не предназначен для переноски больших объекты (например, растровые изображения) и данные внутри них должны быть сериализованы затем десериализуется, что может потреблять много памяти и сделать изменение конфигурации происходит медленно. В такой ситуации вы можете облегчить бремя повторной инициализации вашей деятельности путем сохранения объекта с состоянием когда ваша деятельность перезапущена из-за изменения конфигурации.чтобы сохранить объект во время изменения конфигурации среды выполнения:
- переопределить
onRetainNonConfigurationInstance()
способ вернуть объект, который вы хотели бы сохранить.- когда активность создается заново, звоните
getLastNonConfigurationInstance()
для восстановления объекта.
Я прохожу через Android учебники из TheNewBoston https://thenewboston.com/
В 4-м разделе, Трэвис провел нас через создание приложения камеры, которая может установить изображение в качестве обоев, а также. Проблема с исчезающим растровым изображением при вращении не была решена, однако он только предложил android:configChanges="orientation"
решение, которое временно блокирует вращение экрана.
используя информацию с этой страницы, я добавил
if (savedInstanceState != null) {
bmp = savedInstanceState.getParcelable("bitmap");
iv.setImageBitmap(bmp);
}
В конце onCreate
и добавил, что это переопределить
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("bitmap", bmp);
}
в классе.
это решило проблему исчезающего растрового изображения.
метод onConfigurationChanged (), вероятно, будет самым простым решением вашей проблемы. Он сохраняет текущее состояние приложений между переключателями ориентации
этой ссылке больше информации об этом.