在AndroidX中不推荐使用onRetainCustomNonConfigurationInstance

时间:2019-09-13 10:50:07

标签: android kotlin androidx

onRetainCustomNonConfigurationInstance在第一个版本于2018年发布时已在AndroidX中弃用!正如AndroidX Activity library在发行说明中所说的:

onRetainCustomNonConfigurationInstance已过时。使用ViewModel来存储需要保留配置更改的对象。

我只希望单个对象在配置更改后仍然存在,这就是onRetainCustomNonConfigurationInstance的目的!

对于我的用例,我希望Dagger图的一个实例能够在Activity中的配置更改中幸存下来,但对于该用例,使用AAC ViewModel并不适合我。 Dagger注入了我的ViewModel,我不想仅仅为了使它在配置更改后生存下来而将我的图形包装在另一个ViewModel中。

还有其他方法可以使对象在配置更改后幸存吗?

1 个答案:

答案 0 :(得分:2)

使用ViewModel是使对象不受配置更改影响的最准确和推荐的方法,您应该使用它。您本可以使用onSaveInstanceState,但这会迫使所有需要支持Parcelable的对象,这不仅合理,而且有时是不可能的。

要替换onRetainCustomNonConfigurationInstance,可以使用支持ViewModel的相同API来处理所有复杂性。

您可以使用LongLastingElement API (code here)的此实现,该实现在后台使用ViewModel并删除所有样板代码,以使对象在配置更改后仍然有效。

以您的示例为例,为了使Dagger图在使用此API进行配置更改后仍然有效,代码如下所示:

class LoginActivity : AppCompatActivity() {

    private lateinit var loginComponent: LoginComponent

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        loginComponent = LongLastingElement.getInstance<LoginComponent>(this).getElement {
            (applicationContext as MyDaggerApplication).appComponent.loginComponent().create()
        }

        loginComponent.inject(this)
    }
}

LongLastingElement具有一个称为getInstance的静态方法,您可以在其中指定需要存储的对象的类型,并在其中传递生命周期所有者。然后,调用getElement方法,它会收到一个lambda作为参数,需要创建要存储的对象的实例。

由于生命周期所有者用于获取LongLastingElement实例,因此getElement用作参数的lambda将仅被调用一次。它将在第一次调用时创建该对象的实例,并且在更改配置和随后对getElement的调用之后,该实例将被重用。这适用于任何生命周期所有者,例如“活动”和“片段”。