Lifecycle知识点速览
一、lifecycle组件概览,为什么有它,服务启动然后停止这样一个生命周期,如果服务没有启动,然后停止肯定崩溃,所以希望有lifecycle
-
依赖库
// implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'//已经废弃 //以下依赖可以不写,但为了一致性,需要进行编写 implementation 'androidx.lifecycle:lifecycle-runtime:2.3.0-alpha05' kapt "androidx.lifecycle:lifecycle-common-java8:2.3.0-alpha05"
默认创建project
的时候,core\appcompat
的androidx
依赖库即包含对应lifecycle
的依赖
./gradlew 'moduleName':dependencies
指令 查看依赖库结构
-
主要依赖包
lifecycle-runtime
、lifecycle-common
-
lifecycle-runtime
-
Lifecycleregistry
-
ReportFragment
-
LifecycleRegistryOwner
-
-
lifecycle-common
-
二、Lifecyle基础使用
-
原理 Observable 观察者模式
-
继承ComponentActivity的子类,而不是Activity
//ComponentActivity 实现lifecycleOwner mLifecycleRegistry getState// addObserver
class MainActivity : AppCompatActivity() { private val mockPlayer = MockMediaPlayer() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // mockPlayer.onCreate() MockMediaPlayer2(this) // MockMediaPlayer3(this) Log.i("MainActivity", "onCreate") } }
-
媒体播放,位置获取,添加生命周期感知,自定义observer实现,两种方式实现
-
//第一种 需要自己通过注解的方式和对应的周期对应起来 class MockMediaPlayer2(private val owner: LifecycleOwner) : LifecycleObserver { private lateinit var player: MediaPlayer init { //关联生命周期的观察者 owner.lifecycle.addObserver(this) } @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreate() { player = MediaPlayer() Log.d("MockMediaPlayer2", "onCreate") } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { thread { SystemClock.sleep(3000)//模拟阻塞1s if (owner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { player.start() Log.d("MockMediaPlayer2", "onResume") } } } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { player.stop() Log.d("MockMediaPlayer2", "onPause") } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { player.release() Log.d("MockMediaPlayer2", "onDestroy") } }
-
将
observer
添加至lifecycleOwner
中//第二种方式 lifecycleOwner一定要在初始化里面 class MockMediaPlayer3(private val owner: LifecycleOwner) : LifecycleEventObserver { private lateinit var player: MediaPlayer init { //关联生命周期的观察者 owner.lifecycle.addObserver(this) } override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { when (event) { Lifecycle.Event.ON_CREATE -> { Log.d("MockMediaPlayer3", "onCreate") player = MediaPlayer() } Lifecycle.Event.ON_START, Lifecycle.Event.ON_RESUME -> { if (owner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { player.start() Log.d("MockMediaPlayer3", "onResume") } } Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_STOP -> { player.stop() Log.d("MockMediaPlayer3", "onPause") } Lifecycle.Event.ON_DESTROY -> { player.release() Log.d("MockMediaPlayer3", "onDestroy") } Lifecycle.Event.ON_ANY -> Log.d("MockMediaPlayer3", "onAny") } } }