Java 设备旋转导致活动被破坏和创建
我知道Android会破坏当前活动并重新创建它,因为设备配置在运行时发生了变化 但设计这种行为背后的理由是什么 我的意思是,为什么要销毁并重新创建当前活动。Java 设备旋转导致活动被破坏和创建,java,android,Java,Android,我知道Android会破坏当前活动并重新创建它,因为设备配置在运行时发生了变化 但设计这种行为背后的理由是什么 我的意思是,为什么要销毁并重新创建当前活动。 如果不是这样,有什么缺点吗?只需添加到manifest android:configChanges=screenSize |定向到活动标签中即可 但设计这种行为背后的理由是什么 配置更改通常意味着您需要不同的资源: 用于区域设置更改的不同字符串 方向更改的不同布局 夜间模式和日间模式的不同图形 等等 Android没有办法取代你所有的资
如果不是这样,有什么缺点吗?只需添加到manifest android:configChanges=screenSize |定向到活动标签中即可 但设计这种行为背后的理由是什么 配置更改通常意味着您需要不同的资源:
- 用于区域设置更改的不同字符串
- 方向更改的不同布局
- 夜间模式和日间模式的不同图形
- 等等
- 它们将防止某些配置更改(而不是其他配置更改)导致活动被破坏和重新创建,因此当发生其他配置更改时,它们的应用程序将中断。因此,例如,当用户将设备放在桌面基座上时,应用程序可能会中断,因为开发人员将
添加到清单中,并完全忽略了其他配置更改场景android:configChanges=screenSize | orientation
- 他们将失去资源。例如,“只需添加到清单android:configChanges=screenSize | orientation into activity tag”实际上不会修复UI以考虑屏幕方向,因此UI可能会从底部被切断。或者,开发人员忘记了重新加载每个字符串资源,因此现在随着区域设置的更改,UI有了一组混合的语言。等等
- 首先,让我们看看:
重新启动行为旨在通过使用与新设备配置匹配的替代资源自动重新加载应用程序,帮助应用程序适应新配置
那是什么意思?安卓的设计师们决定(大多数*)设计良好的应用程序应该有适合不同配置的资源。例如,大多数应用程序都有不同的纵向和横向模式布局。不仅如此,语言的变化可能需要不同的字符串,等等
要处理这个问题,有(至少)两种方法之一。重新启动整个程序,或者只是加载新资源
只加载新资源会给开发人员(IMO)带来额外的负担,迫使他们更深入地思考到底需要哪些资源,并使他们都以某种
onConfigChanged()
方法重新加载。如果你错过了一个怎么办?如果加载顺序与以前不同,该怎么办?这会改变一切吗
通过重新启动整个过程,它可以确保您从一张白纸开始,应用程序的响应方式应该与您从该配置开始时的响应方式完全相同(从技术上讲,您是这样做的)
*当然也有例外。例如,任何被锁定为一个方向的应用程序都与方向更改无关。一些企业应用程序不需要多种语言,等等。目标是让90%的用户更容易使用,而不是10%的用户。这种生命周期流程背后的原因是android提供了基于设备配置使用特定资源的机制 例如,如果您希望在纵向模式下使用一个布局文件,而在横向模式下使用另一个布局文件,则使用纵向模式实例化的活动将无法访问景观文件,除非它经过重新创建自身的过程。然后设计UI控制器(无论是活动还是片段)以放大正确的视图,并根据配置使用特定的呈现逻辑。Android为您提供了钩子来保存在一个配置中加载的数据或状态,然后在配置更改时重新加载 95%的情况下,大多数应用程序/开发人员都不使用这种模式,最终会使您的代码更加冗长,因为您需要在配置更改时保存对象的状态,但android也为您提供了一种机制来处理这种情况 是一种将UI或数据的状态存储在片段中的机制,当活动旋转时,它将在旋转时使用相同的片段。模式是这样的
//in onCreate in your activity
Fragment myFrag = getSupportFragmentManager().findFragmentByTag("MY_FRAGMENT_TAG");
if(myFrag == null) {
myFrag = new MyFragment();
myFrag.setRetainInstanceState(true);
getSupportFragmentManager().beginTransaction().
.replace(android.R.id.content, myFrag, "MY_FRAGMENT_TAG");
.commit();
}
当活动再次运行onCreate时,它将调用findFragmentByTag,它将不会为null,并且旧片段仍将附加到UI首先,它不能解决问题,因为除此之外还有许多其他配置更改。其次,很少有应用程序需要对方向更改进行零更改,因此通常需要比“仅添加到清单”更多的工作。