Android应用重置方向更改,最好的处理方式?

时间:2010-05-05 15:36:08

标签: android serialization orientation parcelable

所以我正在制作一个基本的国际象棋应用来玩各种各样的android编程元素,到目前为止我学到了很多,但这次我迷路了。

当模拟器的方向改变时,活动将被重置。根据我的研究,在应用程序暂停/中断的任何时候都会发生同样的事情,即。键盘更换,电话,打回家钥匙等。

显然,让国际象棋游戏不断重置是不可行的,所以我再次发现自己需要学习如何解决这个问题。

我的研究提出了一些主要的事情,在我的Activity中覆盖onPaused方法,在我的清单中监听Orientation,键盘更改(通过android:configChanges),使用Parcelables或Serialization。

我已经使用Pacelables查找了很多示例代码,但说实话它太混乱了。也许明天以新鲜的眼睛回来将是有益的,但是现在我越是看到Parcelables它的意义就越小。

我的应用程序使用一个Board对象,它有64个Cell对象(在8x8 2D数组中),每个单元格都有一个Piece Object,如果空格是空的,则为实际的一块或null。假设我使用Parcelable或Serialization,我假设我必须对每个类,Board,Cell和Piece进行Parcelize或Serialize。

首先,Parcelable或Serialization是否正确地考虑这个问题?如果是这样,Parcelable或Serializable是首选吗?我是否正确假设三个对象中的每一个都必须是Parceled / Serialized?最后,是否有人链接到一个简单易懂的Parcelable教程?任何可以帮助我理解的东西,当我的应用程序进一步扩展时,可以阻止进一步的麻烦。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:8)

在< Activity>中的清单中tag,你可以添加android:configChanges =“orientation | keyboardHidden”,这将阻止活动重新加载并调用onConfigurationChanged(),而不是改变方向或隐藏键盘。

如果您需要在发生这些事件中的任何一个时进行调整,您可以覆盖活动中的onConfigurationChanged(),如果不是您需要做的就是将属性添加到清单。

类似的东西:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.myLayout);
}

效果很好。

答案 1 :(得分:3)

Androids处理事件的默认方式是重新创建活动。基本上你正确处理一个过程,一切正常,不用担心手动处理这些事情。

Application Fundamentals有一个完整的活动生命周期概述,但总之,你想在onSaveInstanceState()方法中保存你的活动状态,并使用你在onCreate(Bundle savedInstanceState)中获得的Bundle来恢复你的申请状态。

如果您想将课程存储在Bundle中,最好的办法是实现Parcelable界面。然后保存您的状态:

protected void onSaveInstanceState(Bundle outState)
{
  super.onSaveInstanceState(outState);
  outState.putParcelable("yourObject", mYourObject);
}

在onCreate方法中你只需:

if (savedInstanceState != null)
  mYourObject = savedInstanceState.getParcelable("yourObject");

当然,您可以将对象转换为Bundle已经包含的常规数组表示形式,然后跳过实现Parcelable接口。基本上为方法添加一个方法toArray()和一个静态方法fromArray()。好吧,到处玩,看看哪个更适合你。

答案 2 :(得分:3)

或者在OnCreate中粘贴这一行,这样它就不会发生变化。问题解决了。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

答案 3 :(得分:1)

覆盖Activity类中的onRetainNonConfigurationInstance。

在此方法中,您必须返回一个对象,只需将游戏状态捆绑在一个状态对象中,然后以此方法返回。确保这只是一个状态对象,我的意思是它应该没有包含在其中的活动,视图等的句柄,否则你会得到内存泄漏。

在你的onCreate方法中调用getLastNonConfigurationInstance来获取对象。

你不必担心android处理的实现细节(序列化)。

如果您尚未确定已将清单中的启动模式设置为singleTask或singleInstance,具体取决于哪种更适合您的需求。默认情况下,如果有人回到家中然后回到您的应用程序,它会启动活动的新副本,如果没有处理或配置单个实例,您将获得运行的游戏活动的多个副本。

答案 4 :(得分:1)

当您保存电路板状态时,请设置int[64]并在每个位置存储相应的部分。所以0 =空,1 =白兵,2 =白骑士等......

加载电路板状态时,遍历数组并在适当的位置创建相应的电路对象。

您可以将int [64]转换为要存储在SharedPreferences中的字符串,或者将其与Parcelable或其他任何内容一起使用。只存储您需要的最少数据。