一种选择是android:configChanges="orientation"
告诉 android 你想自己处理配置更改,而不是让它重新创建 Activity。但是,不鼓励这样做:
当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用该属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并调用其 onConfigurationChanged() 方法。注意:应避免使用此属性,仅将其用作最后的手段。有关如何正确处理由于配置更改而重新启动的更多信息,请阅读处理运行时更改。(来源)
在配置更改期间保留对象有另一种方式:ViewModel可用于为您的数据定义包装类。Activity 的每个实例似乎都有自己的一组 ViewModel,可通过
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
如果您LiveData
在其中使用,您可以订阅文档中概述的数据更改。这是他们的示例,以防万一链接在某个时候失效:
架构组件为负责为 UI 准备数据的 UI 控制器提供 ViewModel 帮助器类。ViewModel 对象在配置更改期间自动保留,以便它们保存的数据可立即用于下一个活动或片段实例。例如,如果您需要在应用程序中显示用户列表,请确保将获取和保留用户列表的责任分配给 ViewModel,而不是 Activity 或 Fragment,如以下示例代码所示:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
} } You can then access the list from an activity as follows:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
} }
如果重新创建活动,它会接收到由第一个活动创建的相同 MyViewModel 实例。所有者活动完成后,框架调用 ViewModel 对象的 onCleared() 方法,以便它可以清理资源。