Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android saveInstanceState+;restoreInstanceState VS configChanges_Android_Android Manifest - Fatal编程技术网

Android saveInstanceState+;restoreInstanceState VS configChanges

Android saveInstanceState+;restoreInstanceState VS configChanges,android,android-manifest,Android,Android Manifest,我遇到了两种方法来防止活动在屏幕旋转时重新绘制。 一个是saveInstanceState+restoreInstanceState组合,我还没有成功实现它 另一个是将清单文件的活动标记中的configChanges属性声明为orientation 我很好奇这两种解决方案之间有什么区别。这两种解决方案都与活动生命周期中的数据持久性有关。请阅读有关生命周期的更多信息 基本的区别在于,当应用程序死亡时,使用“保存/恢复实例”组合(有许多不同的方法)可以保存应用程序的状态,而当活动之前被销毁后,可以从

我遇到了两种方法来防止活动在屏幕旋转时重新绘制。 一个是saveInstanceState+restoreInstanceState组合,我还没有成功实现它

另一个是将清单文件的活动标记中的configChanges属性声明为orientation


我很好奇这两种解决方案之间有什么区别。

这两种解决方案都与活动生命周期中的数据持久性有关。请阅读有关生命周期的更多信息

基本的区别在于,当应用程序死亡时,使用“保存/恢复实例”组合(有许多不同的方法)可以保存应用程序的状态,而当活动之前被销毁后,可以从系统传递给活动的捆绑包中恢复保存的实例状态

configChanges
列出活动将自行处理的配置更改。在运行时发生配置更改时,默认情况下会关闭并重新启动活动,但使用此属性声明配置将阻止重新启动活动

一般来说,我建议不要用configChanges attr在应用程序中锁定方向,以防止活动停止。只需保存其状态并在整个生命周期中恢复即可

我很好奇这两者之间有什么区别

saveInstanceState+restoreInstanceState组合与configChanges之间的区别在于,清单中的configcahnges属性将防止在发生指定更改时销毁活动。在Android中,当您旋转设备或屏幕大小改变时,活动将被销毁并重新创建

saveInstanceState+restoreInstanceState组合将不会阻止销毁和重新创建活动。事实上,它们只会帮助您将数据从已销毁的活动传递到将要重新创建的活动。 在saveInstanceState中,您可以将所有需要的数据保存到bundle对象中。然后,在restoreInstanceState中获取这些数据,并在重新创建的活动中使用它们

configChanges
例如,如果我在清单文件中的活动标记内使用此属性:

android:configChanges="orientation|screenSize"
现在,当屏幕旋转时,此活动不会被销毁,活动的所有数据将保持原样,因为它不会被销毁

saveInstanceState+restoreInstanceState组合,我仍然无法成功实现

下面是saveInstanceState+restoreInstanceState组合的工作方式:

假设我有一个名为
userScore
的全局变量,用于保存游戏中的用户分数。现在,我没有在我的活动标签中使用属性
android:configChanges=“orientation | screenSize”
,因此如果用户旋转屏幕,它将被销毁,分数将丢失。为了防止它们丢失,我将使用saveInstanceState+restoreInstanceState,如下所示:

 @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putInt("Score", userScore); // saving the userScore value 
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        userScore = savedInstanceState.getInt("Score"); // restoring the userScore value 
        super.onRestoreInstanceState(savedInstanceState);
    }

在一个场景中,您正在处理所有 在没有重新启动活动的情况下进行相关配置更改。。而在第二秒钟,您只需处理所需的用户状态变量,即保存和恢复它们

在运行时发生配置更改时,默认情况下会关闭并重新启动活动,但使用android:configChanges属性声明配置将阻止活动重新启动。相反,活动将保持运行并调用其onConfigurationChanged()方法,自行处理配置更改是一项复杂的任务,应该避免

由于处理配置更改的隐藏复杂性,建议不要自己处理配置更改

但是,如果无法使用首选选项(onSaveInstanceState()、ViewModels和持久存储)保留UI状态,则可以在某些配置更改期间阻止系统重新启动活动。当配置发生更改时,您的应用程序将收到回调,以便您可以根据需要手动更新活动