`

onRetainNonConfigurationInstance和getLastNonConfigurationInstance

阅读更多
    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()之间。
分享到:
评论

相关推荐

    android横竖屏

    - 利用`onRetainNonConfigurationInstance()`和`getLastNonConfigurationInstance()`方法,保留非配置相关的对象,避免在横竖屏切换时重复创建。 总之,处理Android横竖屏切换需要理解Activity生命周期、资源适配和...

    Android项目 手机横竖屏.rar

    3. 重写`onRetainNonConfigurationInstance()`:在API 13及以上版本,可以返回一个对象,系统会在旋转后的新Activity中通过`getLastNonConfigurationInstance()`获取。 总结,Android项目中处理横竖屏切换需要理解...

    ArcGIS_for_Android

    Object init = getLastNonConfigurationInstance(); if (init != null) { map.setInitExtent((Extent) ((Object[]) init)[0]); map.setInitResolution(((Double) ((Object[]) init)[1]).doubleValue()); } } ...

    Android开发 旋转屏幕导致Activity重建解决方法

    如果恢复过程较为复杂,可以实现`onRetainNonConfigurationInstance()`方法,将数据对象保存并供新创建的Activity通过`getLastNonConfigurationInstance()`获取。 3. **手动处理配置变化**: 通过在...

    activity fragments

    当配置变更发生时,AsyncTask会丢失其状态,因此需要在`onRetainNonConfigurationInstance()`中返回一个对象来保存AsyncTask,然后在新Activity中恢复。 - 使用`IntentService`:对于长时间运行的任务,...

    Android学习小结之Activity保存和恢复状态

    - 使用`onRetainNonConfigurationInstance()`方法可以保留一个对象引用,该对象不会因配置变化而丢失,但不适用于Activity销毁的情况。 - 使用`ViewModel`类(Android架构组件的一部分)可以更方便地管理Activity...

    Android RetainFragment状态保存的方法

    在API 3.0及更高版本中,`onRetainNonConfigurationInstance()`用于在配置变化时保留数据对象,但不适用于所有配置变化,例如语言和时区改变。这种方法现在已经不推荐使用,因为有更好的替代方案,比如`ViewModel`。...

    Android实现横竖屏切换的实例代码

    为了解决这个问题,我们可以使用 onRetainNonConfigurationInstance() 或 onSaveInstanceState() 方法来保存数据。 在 AndroidManifest.xml 文件中,我们可以使用 android:configChanges 属性来指定 Activity 对...

Global site tag (gtag.js) - Google Analytics