Android方向更改丢失数据解决方案不起作用

Android方向更改丢失数据解决方案不起作用,android,android-studio,android-manifest,android-orientation,Android,Android Studio,Android Manifest,Android Orientation,我一直在寻找一个解决方案,如何使我的应用程序在手机方向改变时不会丢失数据。我已经找到了一个,它正在添加这行代码 android:configChanges="orientation|keyboardHidden"> 到android清单。所以我做到了: <?xml version="1.0" encoding="utf-8"?> }更改此选项: android:configChanges="orientation|keyboardHidden"> 致: 方向: 屏幕

我一直在寻找一个解决方案,如何使我的应用程序在手机方向改变时不会丢失数据。我已经找到了一个,它正在添加这行代码

android:configChanges="orientation|keyboardHidden">
到android清单。所以我做到了:

<?xml version="1.0" encoding="utf-8"?>
}更改此选项:

android:configChanges="orientation|keyboardHidden">
致:

方向: 屏幕方向已更改-用户已旋转 这个装置

注意:如果您的应用程序的目标API级别为声明的13级或更高级别 通过minSdkVersion和targetSdkVersionattributes,您应该 还要声明屏幕大小配置,因为它也会更改 当设备在纵向和横向之间切换时


您的解决方案是本文中所述的不良做法

也许最黑客和最广泛滥用的解决方法是通过在android清单中设置android:configChanges属性来禁用默认的销毁和重新创建行为。这种方法明显的简单性使得它对开发人员非常有吸引力;然而,谷歌工程师不鼓励使用它。主要问题是,它需要您在代码中手动处理设备配置更改。处理配置更改需要您采取许多额外的步骤,以确保每个字符串、布局、可绘制、维度等与设备的当前配置保持同步,如果您不小心,您的应用程序很容易会因此产生一系列特定于资源的错误

谷歌不鼓励使用它的另一个原因是因为很多 开发人员错误地假设了该设置 例如,android:configChanges=orientation将神奇地 保护其应用程序不受不可预知的场景的影响,其中 基础活动将被销毁并重新创建。这不是问题所在 案例发生配置更改的原因有很多,不仅仅是 屏幕方向改变。将您的设备插入显示坞, 更改默认语言,并修改设备的默认字体 比例因子只是三个可以触发 设备配置更改,所有这些都向系统发出销毁信号 并在下次运行时重新创建所有当前正在运行的活动 接着说。因此,无法设置android:configChanges属性 一般来说,这不是一个好的做法

有两种情况: 1-如果只需要保存某些属性,只需使用onSavedInstanceState和onRestoreInstanceState

2-如果您有一个更复杂的场景,其中有正在运行的线程、异步任务和套接字。 你可以:

1-按照所述管理保留片段内的对象

2-更好的解决方案是使用为解决这一确切问题而创建的解决方案

来自android文档:

如果您直接在活动或片段中获取数据,您的用户将由于从UI线程执行可能较慢的查询而缺乏响应

如果您从另一个线程(可能是使用AsyncTask)获取数据,那么您将负责管理该线程和UI线程 通过各种活动或片段生命周期事件,例如 onDestroy和配置更改

装载机解决了这些问题,并带来了其他好处。例如:

加载程序在不同的线程上运行,以防止用户界面出现问题或无响应。 加载程序通过在需要时提供回调方法来简化线程管理 事件发生了。加载程序在整个配置中保持并缓存结果 更改以防止重复查询。加载程序可以实现 观察者监视基础数据源中的更改。对于 例如,CursorLoader会自动将ContentObserver注册到 当数据更改时触发重新加载

因为你的特殊情况

使用以下代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        scoreofShooter1 = savedInstanceState.getInt("scoreofShooter1");
        scoreofShooter2 = savedInstanceState.getInt("scoreofShooter2");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("scoreofShooter1", scoreofShooter1);
    outState.putInt("scoreofShooter2", scoreofShooter2);
}

可能重复的Hi,很抱歉,它看起来像是重复的,但我已经阅读了该主题,不明白我的错误在哪里,因此如果有人能够帮助我解决这个问题,我将非常高兴,非常感谢您的理解。链接[2]已断开/不是有效的链接Hi,非常感谢您的帮助。第一个发布的解决方案是一个糟糕的做法,但我的应用程序并不复杂,我可以通过onSavedInstanceState和onRestoreInstanceState来实现,问题是,我不知道如何实现这一点,相信我,我已经尝试并阅读了大量文档,但我的oop技能太低,即使这对我来说是个问题,我还是一个完全的初学者。我已经在我的第一篇文章中发布了我的java代码,所以如果你愿意的话,请看一下它,然后给我发布了一些精确的代码,我可以从那里开始工作
android:configChanges="orientation|keyboardHidden">
android:configChanges="orientation|keyboardHidden|screenSize">
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        scoreofShooter1 = savedInstanceState.getInt("scoreofShooter1");
        scoreofShooter2 = savedInstanceState.getInt("scoreofShooter2");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("scoreofShooter1", scoreofShooter1);
    outState.putInt("scoreofShooter2", scoreofShooter2);
}