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

时间:2012-07-05 14:20:38

标签: android bitmap savestate

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

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

我读到如果方向发生变化,则会销毁活动并再次重新创建(onCreate(Bundle created)被调用)。 我不确定它是否也应该调用onSavedInstanceState(Bundle bundle),因为在我的应用程序中,只有在另一个活动将焦点放在我的主要活动之上时才会调用它,而不是在旋转到横向/纵向时。 / p>

我只是在寻找一种方法来保存现有的位图,并在方向发生变化时将其传递给主要活动。如果我的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()");
}

任何帮助将不胜感激。

编辑:

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

android:configChanges="orientation"
当我在设备上更改方向时,

现在onSaveInstanceState()会被调用。

5 个答案:

答案 0 :(得分:7)

您应该完全阅读this article

  

...你可能无法完全恢复你的生命   具有Bundle的活动状态,系统为您保存   onSaveInstanceState()回调 - 它不是为了携带大号而设计的   对象(如位图)及其中的数据必须序列化   然后反序列化,这可以消耗大量的内存并使其成为   配置变化缓慢。在这种情况下,你可以缓解   通过保留有状态对象来重新初始化您的活动的负担   当您的活动因配置更改而重新启动时。

     

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

     
      
  1. 覆盖onRetainNonConfigurationInstance()方法以返回   你想保留的对象。
  2.   
  3. 再次创建活动时,   致电getLastNonConfigurationInstance()以恢复您的对象。
  4.   

答案 1 :(得分:5)

我正在浏览TheNewBoston https://thenewboston.com/

的Android教程

在第4部分中,Travis引导我们制作了一个可以将图片设置为壁纸的相机应用程序。旋转位图消失的问题没有得到解决,但他只提供了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);
}

在课堂上。

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

答案 2 :(得分:0)

onConfigurationChanged()方法可能是解决您问题的最简单方法。 它可以在方向开关之间保存应用程序当前状态

link有更多相关信息。

答案 3 :(得分:0)

现在,您可以将数据存储在视图模型中,并在配置更改时保留它们。

答案 4 :(得分:-11)

将您的位图保存在onPause()onDestroy()中,因为我认为在切换方向时,android系统永远不会调用onSavedInstanceState()