Android_Jetpack学习之路二(LifeCycle组件)
LifeCycle组件
LifeCycle可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。
我们以百度定位为例,我们一般在Activity生命周期的oncreate回调函数里调用 自定义类LocationService的start()方法,在onStop回调里调用LocationService的stop() 方法来启动和停止定位服务。
那么,我们可不可以解开Activity生命周期函数与LocationService的耦合性能?
答案是,利用LifeCycle让LocationService作为观察者,能感知到Activity的声明周期,当acitivty执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动和停止定位,而无需再在activity里写调用LocationService.start()与LocationService.stop的代码了。当然这里的被观察者自然就是acitivty了。
,当acitivty执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动和停止定位。
使用LifeCycle解耦Activity与自定义组件
让自定义类(或者称作自定组件)实现LifecycleObserver,在要执行的函数start()和stop()上面添加注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)与 @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 。
/**
* 封装了定位的开启和停止
*/
public class LocationService implements LifecycleObserver {
String TAG = getClass().getSimpleName();
/**
* 开始定位
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void start(){
Log.d(TAG,"location Service start...");
}
/**
* 停止定位
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stop(){
Log.d(TAG,"location Service stop...");
}
}
在一个Activity中new一个自定义类的对象实例,如LocationService类对象locationService.将getLifecycle().addObserver
locationService将观察者与被观察者绑定
LocationService locationService = new LocationService();
getLifecycle().addObserver(locationService);
运行项目,对这个Activity进行开启和结束操作就可以得到运行结果:
2023-03-09 11:18:53.622 6528-6528/com.lxs.lifecycle D/TestActivity: Activity onStart...
2023-03-09 11:18:53.622 6528-6528/com.lxs.lifecycle D/LocationService: location Service start...
2023-03-09 11:18:56.353 6528-6528/com.lxs.lifecycle D/LocationService: location Service stop...
2023-03-09 11:18:56.354 6528-6528/com.lxs.lifecycle D/TestActivity: Activity onStop...
LifeCycle中Event中分别对应了activity中的各个生命周期
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
我们可以发现使用Lifecycle提高了自定义组件的复用性,降低可以自定义组件与Activity等系统组件的耦合性,不需要在Activity的onStop()等方法中进行关闭操作等等。
使用LifeCycle解耦Service与自定义组件
关键步骤:build.gradle中引入依赖
implementation “androidx.lifecycle:lifecycle-extensions:2.2.0”
- Service处理
让我们的Service继承于LifecycleService(LifecycleService实际上就是Service 实现LifecycleOwner接口)getLifecycle().addObserve()将观察者与被观察者绑定,即将自定义类与Service绑定。
public class MyService extends LifecycleService {
LocationService locationService;
String TAG =getClass().getSimpleName();
public MyService() {
locationService = new LocationService();
getLifecycle().addObserver(locationService);
}
@Override
public void onCreate() {
Log.i(TAG,"onCreate");
super.onCreate();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i(TAG,"onDestroy");
super.onDestroy();
}
}
自定义类实现LifecycleObserver接口,添加标签注解事件@OnLifecycleEvent,感知Service的声明周期。
public class LocationService implements LifecycleObserver {
String TAG = getClass().getSimpleName();
/**
* 开始定位
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void start(){
Log.d(TAG,"location Service start...");
}
/**
* 停止定位
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stop(){
Log.d(TAG,"location Service stop...");
}
/**
* 停止定位: 用于感知Service的onDestroy声明周期
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void stopLoc()
{
Log.i(TAG,"location Service destroy...");
}
}
启动和停止service可以得到运行结果:
2023-03-09 15:13:42.645 17116-17116/com.lxs.lifecycle I/MyService: onCreate
2023-03-09 15:13:42.646 17116-17116/com.lxs.lifecycle I/MyService: onStartCommand
2023-03-09 15:13:42.646 17116-17116/com.lxs.lifecycle D/LocationService: location Service start...
2023-03-09 15:13:44.574 17116-17116/com.lxs.lifecycle I/MyService: onDestroy
2023-03-09 15:13:44.574 17116-17116/com.lxs.lifecycle D/LocationService: location Service stop...
2023-03-09 15:13:44.575 17116-17116/com.lxs.lifecycle I/LocationService: location Service destroy...
Service销毁时会执行LifecycleService的onDestory(),会同事完成Lifecycle.Event.ON_STOP和Lifecycle.Event.ON_DESTROY两个事件(使用Runnable,所以上面运行结果中LocationService的stop和destroy会出现在MyService的onDestroy()后面)
使用ProcessLifecycleOwner感知Application
Lifecycle同样可以观察整个进程的生命周期,就是ProcessLifecycleOwner(即进程生命周期拥有者).
同样需要依赖:
implementation “androidx.lifecycle:lifecycle-extensions:2.2.0”
MyApplication 继承Application,ProcessLifecycleOwner.getLifecycle().addObserver()将观察者与被观察者绑定,即将自定义类ApplicationObserver与MyApplication绑定。
public class MyApplication extends Application {
ApplicationObserver applicationObserver;
@Override
public void onCreate() {
Log.d("MyApplication","MyApplication onCreate...");
applicationObserver = new ApplicationObserver();
ProcessLifecycleOwner.get().getLifecycle().addObserver(applicationObserver);
super.onCreate();
}
}
- 自定义类ApplicationObserver实现LifecycleObserver接口,添加标签注解事件,感知Application的声明周期。
public class ApplicationObserver implements LifecycleObserver {
String TAG = getClass().getSimpleName();
/**
* 整个应用程序只感知1次
*/
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate()
{
Log.i(TAG,"ApplicationObserver onCreate...");
}
/**
* 应用程序打到前台
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart()
{
Log.i(TAG,"ApplicationObserver onStart...");
}
/**
* 应用程序打到前台
*/
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume()
{
Log.i(TAG,"ApplicationObserver onResume...");
}
/**
* 应用程序退到后台
*/
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause()
{
Log.i(TAG,"ApplicationObserver onPause...");
}
/**
* 应用程序退到后台
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop()
{
Log.i(TAG,"ApplicationObserver onStop...");
}
/**
* 应用程序销毁,感知不到
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy()
{
Log.i(TAG,"ApplicationObserver onDestroy...");
}
}
运行项目然后退出前台之后得到运行结果
2023-03-09 16:08:48.438 24071-24071/com.lxs.lifecycle D/MyApplication: MyApplication onCreate...
2023-03-09 16:08:48.441 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onCreate...
2023-03-09 16:08:48.555 24071-24071/com.lxs.lifecycle I/MainActivity: onCreate
2023-03-09 16:08:48.558 24071-24071/com.lxs.lifecycle I/MainActivity: onStart
2023-03-09 16:08:48.559 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onStart...
2023-03-09 16:08:48.561 24071-24071/com.lxs.lifecycle I/MainActivity: onResume
2023-03-09 16:08:48.564 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onResume...
2023-03-09 16:09:04.977 24071-24071/com.lxs.lifecycle I/MainActivity: onResume
2023-03-09 16:09:05.651 24071-24071/com.lxs.lifecycle I/MainActivity: onStop
2023-03-09 16:09:05.655 24071-24071/com.lxs.lifecycle I/MainActivity: onDestroy
2023-03-09 16:09:05.686 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onPause...
2023-03-09 16:09:05.686 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onStop...
以上就是Lifecycle的基本用法