Андроид - почему через 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 - он не предназначен для переноски больших объекты (например, растровые изображения) и данные внутри них должны быть сериализованы затем десериализуется, что может потреблять много памяти и сделать изменение конфигурации происходит медленно. В такой ситуации вы можете облегчить бремя повторной инициализации вашей деятельности путем сохранения объекта с состоянием когда ваша деятельность перезапущена из-за изменения конфигурации.

чтобы сохранить объект во время изменения конфигурации среды выполнения:

  1. переопределить onRetainNonConfigurationInstance() способ вернуть объект, который вы хотели бы сохранить.
  2. когда активность создается заново, звоните 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 (), вероятно, будет самым простым решением вашей проблемы. Он сохраняет текущее состояние приложений между переключателями ориентации

этой ссылке больше информации об этом.