Android 中不同的 activity 中實(shí)現(xiàn)共用一個(gè) ViewModel
在實(shí)際開發(fā)過(guò)程中表牢,一個(gè)activity_A會(huì)根據(jù)另一個(gè)activity_B的改變而做出相應(yīng)的變化滞详,聯(lián)想到利用viewmodel+livedata天生具有監(jiān)聽功能實(shí)現(xiàn)钢颂,在viewmodel中存放一個(gè)livedata變量泪姨,在需要改變的activity中添加對(duì)livedata的監(jiān)聽,實(shí)現(xiàn)上述想法。
在 activity_B 中創(chuàng)建一個(gè)靜態(tài)變量來(lái)存放 activity_B 的 viewmodelStoreOwner對(duì)象
companion object{
var mActivity_B : ViewModelStoreOwner? = null
}
在其onCreate回調(diào)中給這個(gè)靜態(tài)變量賦值
override fun onCreate() {
mActivity_B = this //此處 activity_B 實(shí)現(xiàn)了ViewModelStoreOwner接口隘庄,直接賦值this就行
}
特別重要一點(diǎn)九串,由于此處的靜態(tài)變量持有“this”這個(gè)activity_B對(duì)象绞佩,會(huì)導(dǎo)致activity無(wú)法被回收,造成內(nèi)存泄漏猪钮,在activity 的 onDestroy() 的回調(diào)中將靜態(tài)變量釋放
override fun onDestroy() {
super.onDestroy()
mActivity_B = null
}
在 activity_A 中獲取到同一個(gè)ViewModel品山,然后利用監(jiān)聽,獲取viewmodel實(shí)現(xiàn):
private val shareViewModel : ShareViewModel by lazy {
ViewModelProvider(Activity_B.mActivity_B?:this).get(ShareViewModel::class.java)
}
此后再在 activity_A 中創(chuàng)建livedata的監(jiān)聽烤低,然后編寫監(jiān)聽觸發(fā)邏輯肘交。