【问题标题】:Android app resets on orientation change, best way to handle?Android应用程序在方向更改时重置,最好的处理方式?
【发布时间】:2011-02-16 00:11:37
【问题描述】:

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

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

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

我的研究提出了一些主要内容,覆盖我的 Activity 中的 onPaused 方法、监听方向、我的清单中的键盘更改(通过 android:configChanges)、使用 Parcelables 或序列化。

我已经使用 Pacelables 查找了很多示例代码,但老实说它太令人困惑了。也许明天带着新的眼光回来会是有益的,但现在我看 Parcelables 的次数越多,它的意义就越小。

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

首先,Parcelable 或 Serialization 是否是解决这个问题的正确方法?如果是这样,Parcelable 或 Serializable 是首选吗?我是否正确假设这三个对象中的每一个都必须被打包/序列化?最后,有人有一个简单易懂的 Parcelable 教程的链接吗?当我的应用程序进一步扩展时,任何可以帮助我理解并停止进一步头痛的事情。

任何帮助将不胜感激。

【问题讨论】:

    标签: android serialization orientation parcelable


    【解决方案1】:

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

    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】:

      在您的 Activity 类中覆盖 onRetainNonConfigurationInstance。

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

      在您的 onCreate 方法中调用 getLastNonConfigurationInstance 以取回对象。

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

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

      【讨论】:

        【解决方案3】:

        或者把这条线放在你的 OnCreate 中,这样它就不会旋转。问题解决了。

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        

        【讨论】:

        • 为什么要投票?这家伙想通过保持他的应用程序状态改变方向来解决问题。不要将他的应用限制为肖像。这是忽略问题,而不是解决问题!
        【解决方案4】:

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

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

        类似:

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

        效果很好。

        【讨论】:

          【解决方案5】:

          当您保存棋盘状态时,创建一个int[64] 并在每个位置存储相应的棋子。所以 0=空,1=白兵,2=白马,等等……

          当您加载棋盘状态时,遍历数组并在适当的位置创建适当的棋子对象。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-31
            • 2014-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-14
            相关资源
            最近更新 更多