我一直在努力弄清楚这个问题。
虽然我已经读了很多关于方向改变的文章,Android会杀死一个活动并作为新的重新开始,而唯一的处理方法是在onSaveInstanceState()
中保存所有内容,并尝试在onCreate()
内恢复它。
但我的活动在不同的时间进行着许多不同类型的网络活动,如果在执行网络活动时更改方向,则必须处理许多不同且复杂的情况。
是否有简单的方法只需指定Android在方向改变时不需要完全重绘此活动,以便自动保存所有数据并重复使用它?
我想知道是否有这样的东西。
我一直在努力弄清楚这个问题。
虽然我已经读了很多关于方向改变的文章,Android会杀死一个活动并作为新的重新开始,而唯一的处理方法是在onSaveInstanceState()
中保存所有内容,并尝试在onCreate()
内恢复它。
但我的活动在不同的时间进行着许多不同类型的网络活动,如果在执行网络活动时更改方向,则必须处理许多不同且复杂的情况。
是否有简单的方法只需指定Android在方向改变时不需要完全重绘此活动,以便自动保存所有数据并重复使用它?
我想知道是否有这样的东西。
AndroidManifest.xml
文件中的活动声明中添加属性android:configChanges="orientation"
。android:configChanges
属性的目的是防止在必要时重新创建活动。例如,相机应用程序使用此属性,因为当方向更改时,相机预览屏幕不得重新创建。用户希望在旋转设备时相机预览能够在没有延迟的情况下工作,并且相机初始化不是非常快速的过程。因此,手动处理方向更改是相机应用程序的一种本地行为。android:configChanges="orientation"
属性。但是,在使用此调整时真正重要的是,您必须正确实现保存和还原状态的方法!android:configChanges
可以使应用程序的性能得到改进,或在某些罕见情况下使其表现得“本地”,但它并不会减少您需要编写的代码量。但是我的应用程序在不同的时间进行了许多不同类型的网络活动,如果当网络活动正在执行时更改方向,我将不得不处理许多不同和复杂的情况。
然后将该逻辑移出活动并放入服务中。
刚刚回答了这个问题:Android - screen orientation reloads activity
在您的情况下,您希望完全防止Android杀死您的Activity。 您需要更新您的清单以捕获方向更改,然后实现方向更改回调以在发生方向更改时实际执行您需要执行的任何操作(可能是无操作)。
onRetainNonConfigurationInstance()
方法来保存数据,然后在onCreate()
方法中获取数据,就像this tutorial或this所示。@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}
当屏幕方向改变时,将调用此方法,除此之外不会有其他操作。如果您不想更改任何内容,请将其留空。
onRetainNonConfigurationInstance()
,活动重新创建肯定会更慢。 - Michael