「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
Activity中LifeCycle
LifeCycle的作用是将普通组件的生命周期从系统组件中解耦出来,在LifeCycle之前,通常我们添加一个功能组件都要在系统主键的生命周期中添加相关代码,举个例子,比如要添加一个音乐播放的功能,我们可能会这样写代码,在Activity创建时(onCreate)初始化时加载音乐资源,在onResume时播放音乐,在onPause时暂停,在onStop时停止,那么相关代码会类似如下
public class MainActivity extends AppCompatActivity {
MusicPlayer musicPlayer = new MusicPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
musicPlayer.initMusic();
}
@Override
protected void onResume() {
super.onResume();
musicPlayer.playMusic();
}
@Override
protected void onPause() {
super.onPause();
musicPlayer.pauseMusic();
}
@Override
protected void onStop() {
super.onStop();
musicPlayer.stopMusic();
}
}
class MusicPlayer{
public void initMusic(){
}
public void playMusic(){
}
public void pauseMusic(){
}
public void stopMusic(){
}
}
我们可以发现组件MusicPlayer和系统组件Activity存在耦合,当组件越来越多时,会越来越复杂,因此需要将自定义组件和系统组件解耦,可以通过以下方法进行解耦
public class MainActivity extends AppCompatActivity {
MusicPlayer musicPlayer = new MusicPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(musicPlayer);
}
}
class MusicPlayer implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void initMusic(){
Log.d("MusicPlayer","initMusic");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void playMusic(){
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void pauseMusic(){
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stopMusic(){
}
}
这里采用的是设计模式中的观察者模式,Activity系统组件作为被观察者将对它进行观察的自定义组件进行注册,在Activity相关周期到来时会调用对应的自定义组件的方法
Service的解耦
和Activity不同的是Service并没有继承LifecycleOwner,因此如果想要在Service有和Activity中类似的效果,那么需要使用LifeCycleService这个类而不Service,想要使用这个类需要添加依赖
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
public class MyService extends LifecycleService {
MusicPlayer musicPlayer = new MusicPlayer();
public MyService() {
getLifecycle().addObserver(musicPlayer);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
而对于观察者musicPlayer来说,只需要像Activity那样在方法前面添加对应的事件注解就可以了