Android应用程序在方向改变时重置,最好的处理方式是什么?

Android应用程序在方向改变时重置,最好的处理方式是什么?,android,serialization,orientation,parcelable,Android,Serialization,Orientation,Parcelable,因此,我正在制作一个基本的国际象棋应用程序,与android编程的一些不同元素一起玩。到目前为止,我学到了很多东西,但这次我迷路了 当仿真器的方向更改时,活动将重置。根据我的研究,在应用程序暂停/中断的任何时候都会发生同样的事情,如键盘更改、电话呼叫、按home键等 显然,让一盘国际象棋不断重置是不可行的,所以我再次发现自己需要学习如何解决这个问题 我的研究提出了几个主要问题,覆盖活动中的onPaused方法,监听方向,清单中的键盘更改(通过android:configChanges),使用包裹

因此,我正在制作一个基本的国际象棋应用程序,与android编程的一些不同元素一起玩。到目前为止,我学到了很多东西,但这次我迷路了

当仿真器的方向更改时,活动将重置。根据我的研究,在应用程序暂停/中断的任何时候都会发生同样的事情,如键盘更改、电话呼叫、按home键等

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

我的研究提出了几个主要问题,覆盖活动中的onPaused方法,监听方向,清单中的键盘更改(通过android:configChanges),使用包裹或序列化

我查阅了很多使用Pacelables的示例代码,但老实说,这太令人困惑了。也许明天带着新鲜的眼睛回来会有好处,但现在我越是看包裹就越没有意义

我的应用程序使用一个Board对象,它有64个单元对象(在8x8 2D阵列中),每个单元都有一个Piece对象,如果空间为空,则为实际的Piece或null。假设我使用Parcelable或Serialization,我假设我必须对每个类、电路板、单元和工件进行Parcelize或Serialization

首先也是最重要的是,对于这个问题,包裹或序列化是正确的选择吗?如果是这样的话,对于这一点,是否首选可打包或可序列化?我假设三个对象中的每一个都必须打包/序列化,这对吗?最后,有人有一个简单易懂的包裹教程的链接吗?当我的应用程序进一步扩展时,任何有助于我理解并停止进一步头痛的事情


任何帮助都将不胜感激。

Androids处理事件的默认方式是重新创建活动。基本上,您可以正确地处理一个流程,并且一切正常,无需担心手动处理这些事情

具有活动生命周期的完整概述,但简而言之,您希望在onSaveInstanceState()方法中保存活动状态,并使用onCreate(Bundle savedInstanceState)中获得的捆绑包来恢复应用程序状态

如果您想将类存储在Bundle中,那么最好实现接口。然后,要保存您的状态,请执行以下操作:

protected void onSaveInstanceState(Bundle outState)
{
  super.onSaveInstanceState(outState);
  outState.putParcelable("yourObject", mYourObject);
}
在onCreate方法中,您只需执行以下操作:

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

当然,您可以将对象转换为捆绑包已经可以包含的普通数组表示形式,而只需跳过实现Parcelable接口。基本上,向对象添加一个toArray()方法和一个fromArray()静态方法。好的,大家来看看哪一个更适合您。

在活动类中重写onRetainonConfiguration实例

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

在onCreate方法中,调用getLastNonConfigurationInstance以取回对象

您不必担心实现细节(序列化),android会处理这些细节


如果您还没有确保在清单中将启动模式设置为singleTask或singleInstance,这取决于哪个更适合您的需要。默认情况下,如果有人点击主页,然后返回到您的应用程序,它将启动活动的新副本,如果没有针对单个实例进行处理或配置,您将获得游戏活动的多个副本

或者将这条线粘贴到OnCreate中,这样它就不会漫游。问题解决了

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在标记的清单中,您可以添加android:configChanges=“orientation | keyboardHidden”,这将停止重新加载活动,并在方向更改或键盘隐藏时调用onConfigurationChanged()

如果您需要在这些事件发生时进行调整,您可以在活动中重写OnConfiguration Changed(),如果您需要做的不是将属性添加到清单中

比如:

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

很好地工作。

保存电路板状态时,制作一个
int[64]
并在每个位置存储相应的块。所以0=空,1=白兵,2=白骑士,等等

加载线路板状态时,遍历阵列并在适当的位置创建适当的工件对象


您可以将int[64]转换为字符串以存储在SharedReferences中,或者将其与包裹或其他任何东西一起使用。只存储所需的最少数据。

为什么要对其进行升级?这家伙想通过保持应用程序状态不变来解决问题。他的应用程序不限于肖像。这是忽略问题,而不是解决问题!