Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。
当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像
onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。
用这个方法保存Activity State后,通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。比如:
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
在恢复窗口时,我们可以不使用onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。我们可以直接在onCreate中使用,比如
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
这个方法最大的好处是:
* 当Activity曾经通过某个资源得到一些图片或者信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。
* 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。
* 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。
下边是需要特别注意的几点:
* onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。
* 调用顺序同样介于onStop() 和 onDestroy()之间。
分享到:
相关推荐
- 利用`onRetainNonConfigurationInstance()`和`getLastNonConfigurationInstance()`方法,保留非配置相关的对象,避免在横竖屏切换时重复创建。 总之,处理Android横竖屏切换需要理解Activity生命周期、资源适配和...
3. 重写`onRetainNonConfigurationInstance()`:在API 13及以上版本,可以返回一个对象,系统会在旋转后的新Activity中通过`getLastNonConfigurationInstance()`获取。 总结,Android项目中处理横竖屏切换需要理解...
如果恢复过程较为复杂,可以实现`onRetainNonConfigurationInstance()`方法,将数据对象保存并供新创建的Activity通过`getLastNonConfigurationInstance()`获取。 3. **手动处理配置变化**: 通过在...
当配置变更发生时,AsyncTask会丢失其状态,因此需要在`onRetainNonConfigurationInstance()`中返回一个对象来保存AsyncTask,然后在新Activity中恢复。 - 使用`IntentService`:对于长时间运行的任务,...
- 使用`onRetainNonConfigurationInstance()`方法可以保留一个对象引用,该对象不会因配置变化而丢失,但不适用于Activity销毁的情况。 - 使用`ViewModel`类(Android架构组件的一部分)可以更方便地管理Activity...
在API 3.0及更高版本中,`onRetainNonConfigurationInstance()`用于在配置变化时保留数据对象,但不适用于所有配置变化,例如语言和时区改变。这种方法现在已经不推荐使用,因为有更好的替代方案,比如`ViewModel`。...
为了解决这个问题,我们可以使用 onRetainNonConfigurationInstance() 或 onSaveInstanceState() 方法来保存数据。 在 AndroidManifest.xml 文件中,我们可以使用 android:configChanges 属性来指定 Activity 对...