首页 文章

为什么要使用Fragment #setRetainInstance(boolean)?

提问于
浏览
56

我发现Fragment #setRetainInstance(true)令人困惑 . 这是从Android Developer API中提取的Javadoc:

public void setRetainInstance(boolean retain)控制是否在Activity重新创建(例如从配置更改)中保留片段实例 . 这只能用于不在后栈中的片段 . 如果设置,重新创建活动时片段生命周期将略有不同:onDestroy()将不会被调用(但是onDetach()仍将是,因为片段正在与其当前活动分离) . 因为片段没有被重新创建,所以不会调用onCreate(Bundle) . onAttach(Activity)和onActivityCreated(Bundle)仍将被调用 .

Question: How do you as a developer use this, and why does it make things easier?

3 回答

  • 26

    很晚才添加这个答案,但我认为这会让事情更加清晰 . 跟我说吧 . 当setRetainInstance是:

    FALSE

    • 片段在配置更改时重新创建 . NEW INSTANCE已创建 .

    • 在配置更改时调用所有生命周期方法,包括onCreate()和onDestroy() .

    TRUE

    • 片段不会在配置更改时重新创建 . 使用相同的实例 .

    • 所有生命周期方法都在配置更改,APART FROM onCreate()和onDestroy()上调用 .

    • 添加到Backstack时,保留实例将不起作用 .

    不要忘记以上内容适用于DialogFragments以及Fragments .

  • 74

    这对于保持长时间运行的资源(如套接字)非常有用 . 拥有一个无UI片段,可以保存对蓝牙套接字的引用,当用户翻转手机时,您不必担心重新连接它们 .

    它还可以方便地保留对需要很长时间才能加载的资源(如位图或服务器数据)的引用 . 加载一次,将其保留在保留的片段中,当重新加载活动时,它仍然存在,您不必重建它 .

  • 42

    作为开发人员,您如何使用它

    拨打 setRetainInstance(true) . 我通常在 onCreateView()onActivityCreated() 中这样做,我在那里使用它 .

    为什么它会让事情变得更容易?

    它往往比 onRetainNonConfigurationInstance() 更简单,用于处理跨配置更改的数据保留(例如,将设备从纵向旋转到横向) . 在配置更改时销毁并重新创建未保留的片段;保留的碎片不是 . 因此,这些保留的片段保存的任何数据都可用于配置后更改活动 .

相关问题