在Activity和多個Fragment之間共享資源
Android Studio 默認生成的代碼一般是這樣的:
package com.messy.lingplayer.playui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.messy.lingplayer.R
import com.messy.lingplayer.SharedViewModel
class PlayUiFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.play_ui_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
// TODO: Use the ViewModel
}
private lateinit var viewModel: SharedViewModel
companion object {
fun newInstance() = PlayUiFragment()
}
}
關鍵在於這一句
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
其中ViewModelProviders.of(this)表示將viewModel綁定到這個Fragment的生命週期(這裏的this便表示當前的Fragment對象)我們可以將this改爲activity,即將viewModel綁定到Fangment所在的Activity的生命週期上,即
viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
然後再相應的Activity中綁定SharedViewModel:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
initMediaBrowser()
initView()
}
那麼便可在Activity的整個生命週期之內和多個Fragment共享資源
原理
ViewModel的生命週期依賴於對應的Activity或Fragment的生命週期。通常會在Activity第一次onCreate()時創建ViewModel,ViewModel的生命週期一直持續到Activity最終銷燬或Frament最終detached,期間由於屏幕旋轉等配置變化引起的Activity銷燬重建並不會導致ViewModel重建。借用官方示意圖來解釋一下:
這樣就可以避免在Activity直接利用接口進行回調