onRetainCustomNonConfigurationInstance 在 AndroidX 中弃用
onRetainCustomNonConfigurationInstance deprecated in AndroidX
当第一个版本于 2018 年发布时,onRetainCustomNonConfigurationInstance
在 AndroidX 中被弃用!正如 AndroidX Activity library 在发行说明中所说:
onRetainCustomNonConfigurationInstance
已弃用。使用 ViewModel 存储需要在配置更改后继续存在的对象。
我只想让单个对象在配置更改后继续存在,这就是 onRetainCustomNonConfigurationInstance
的目的!
对于我的用例,我希望 Dagger 图的实例能够在 Activity 中的配置更改中幸存下来,但对于该用例,我觉得使用 AAC ViewModel 并不合适。 Dagger 注入了我的 ViewModel,我不想将我的图形包装在另一个 ViewModel 中只是为了让它在配置更改后继续存在。
有没有其他方法可以使对象在配置更改后继续存在?
使用 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 作为参数,需要创建您要存储的对象的实例。
由于Lifecycle owner是用来获取LongLastingElement
实例的,所以getElement
作为参数的lambda只会被调用一次。它将在第一次调用时创建该对象的实例,并且在配置更改和后续调用 getElement
后将重用同一实例。这适用于任何生命周期所有者,例如 Activity 和 Fragments。
onRetainCustomNonConfigurationInstance
在 AndroidX 中被弃用!正如 AndroidX Activity library 在发行说明中所说:
onRetainCustomNonConfigurationInstance
已弃用。使用 ViewModel 存储需要在配置更改后继续存在的对象。
我只想让单个对象在配置更改后继续存在,这就是 onRetainCustomNonConfigurationInstance
的目的!
对于我的用例,我希望 Dagger 图的实例能够在 Activity 中的配置更改中幸存下来,但对于该用例,我觉得使用 AAC ViewModel 并不合适。 Dagger 注入了我的 ViewModel,我不想将我的图形包装在另一个 ViewModel 中只是为了让它在配置更改后继续存在。
有没有其他方法可以使对象在配置更改后继续存在?
使用 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 作为参数,需要创建您要存储的对象的实例。
由于Lifecycle owner是用来获取LongLastingElement
实例的,所以getElement
作为参数的lambda只会被调用一次。它将在第一次调用时创建该对象的实例,并且在配置更改和后续调用 getElement
后将重用同一实例。这适用于任何生命周期所有者,例如 Activity 和 Fragments。