我有一个游戏,我在SurfaceView上绘制和移动位图。用户可以交互(拖放)这些位图。当玩家击中主页按钮然后回到游戏中时,我希望能够暂停游戏,然后将其恢复到离开游戏之前的位置。什么是最好的方式来存储我的自定义对象?我应该在哪里存储我的游戏关卡状态?
我应该实现
onSaveInstanceState(Bundle)
,并拥有所有我要救实现Parcelable
接口,其对象的类的?这将是相当多的工作,我仍然不确定我将如何保存像位图这样的东西。我想我不会,我只是从磁盘重新加载。我也对捆绑软件提供的存储类型感到困惑:除非您自己清除它,否则永远不会消失的磁盘存储,或者如果操作系统决定在内存中删除程序时从内存中消失的内存存储。根据this question中的意见,它是磁盘存储。 documentation意味着它是内存存储,说
Note that it is important to save persistent data in onPause()
,但我不觉得它非常清楚。 This page也意味着它不是持久的:只要应用程序保留在内存中,它就会持续。那么是哪一个呢?- 上面的最后一个链接建议使用
onRetainNonConfigurationInstance()
在应用程序处于后台时将对象保留在内存中。这意味着如果程序在后台被操作系统从内存中取出时,一切都会丢失。这似乎是大多数(所有我测试过的)游戏所做的:如果您在玩游戏时打回家,然后再回去,关卡会恢复。如果你打回家,打开很多东西(足以让Android从内存中移除游戏),然后重新开始,没有任何东西被恢复,游戏从主菜单开始。这是否意味着这是他们使用的,如果是这样,这是一种好的做法吗?
请注意,有关Bundle
的持续性问题只是次要的好奇心。我并不在乎这款游戏的状态是否没有永久保存,并且在游戏进行一段时间后会丢失(如上面的2
所述)。我对这种情况的最佳做法感兴趣。
只是一个小提示:位图实现Parcelable。 (http://developer.android.com/reference/android/graphics/Bitmap.html)。我认为最好/最安全的方法是实施你的解决方案#1。 – YuviDroid 2012-03-17 22:36:58
@YuviDroid - 啊,我确实想念,谢谢:)。这意味着我可以做到这一点,但它仍然留下了一个有168k声望的人暗示我不应该在我链接到的问题中:http://stackoverflow.com/questions/4285877/which-one-to-use-onsaveinstancestate-vs -onretainnonconfigurationinstance - 我想在选择一个方法之前听到一些赞成或反对的论点,因为我觉得这个主题很混乱。 – IVlad 2012-03-17 22:48:18