Android - 为什么使用onSaveInsanceState()来保存未被调用的位图对象?

Sha*_*har 6 android bitmap savestate

我正在制作一个简单的绘图应用程序.

我希望能够在设备方向改变时将用户的绘图保存在屏幕上.这只发生在主要活动中.

我读到如果方向改变,那么活动将被销毁并再次重新创建(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()");
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

编辑:

我从AndroidManifest.xml文件中删除了这一行:

android:configChanges="orientation"
Run Code Online (Sandbox Code Playgroud)

现在onSaveInstanceState(),当我在设备上更改方向时,它会被调用.

Dhe*_*.S. 7

你应该完整阅读这篇文章.

...您可能无法使用系统为onSaveInstanceState()回调保存的Bundle完全恢复您的活动状态 - 它不是为了携带大型对象(如位图)而必须序列化的然后反序列化,这会占用大量内存并使配置变化缓慢.在这种情况下,您可以通过在配置更改时重新启动活动时保留有状态对象来减轻重新初始化活动的负担.

要在运行时配置更改期间保留对象:

  1. 重写onRetainNonConfigurationInstance()方法以返回要保留的对象.
  2. 再次创建活动时,请调用getLastNonConfigurationInstance()以恢复对象.

  • onRetainNonConfigurationInstance现已弃用.使用setRetainInstance(boolean retain)考虑使用 (4认同)

小智 5

我正在浏览TheNewBoston的Android教程https://thenewboston.com/

在第4部分,特拉维斯带我们一起制作了一个可以将图片设置为壁纸的相机应用程序.旋转位图消失的问题没有得到解决,但是他只提供了android:configChanges="orientation"解决方案,它暂时阻止了屏幕旋转.

我添加了使用此页面中的信息

if (savedInstanceState != null) {
    bmp = savedInstanceState.getParcelable("bitmap");
    iv.setImageBitmap(bmp);
}
Run Code Online (Sandbox Code Playgroud)

在onCreate结束时

并添加了此覆盖

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("bitmap", bmp);
}
Run Code Online (Sandbox Code Playgroud)

在课堂里.

这解决了消失的位图问题.