Android Studio 默認生成的代碼通常是這樣的:java
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() } }
關鍵在於這一句android
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
其中ViewModelProviders.of(this)表示將viewModel綁定到這個Fragment的生命週期(這裏的this便表示當前的Fragment對象)咱們能夠將this改成activity,即將viewModel綁定到Fangment所在的Activity的生命週期上,即app
viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
而後再相應的Activity中綁定SharedViewModel:ide
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共享資源ui
ViewModel的生命週期依賴於對應的Activity或Fragment的生命週期。一般會在Activity第一次onCreate()時建立ViewModel,ViewModel的生命週期一直持續到Activity最終銷燬或Frament最終detached,期間因爲屏幕旋轉等配置變化引發的Activity銷燬重建並不會致使ViewModel重建。借用官方示意圖來解釋一下:
這樣就能夠避免在Activity直接利用接口進行回調this