JetPack学习笔记之LifeCyCle(二)
2020-08-05 本文已影响0人
秀儿2020
JetPack学习笔记之LifeCyCle(二)
上文介绍了使用LifeCycle监听Activity和Service生命周期变化的方法,本文介绍监听Service和Application的生命周期的方法。
1、监听Service的生命周期
要监听Service的生命周期,需要先引入依赖
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
在创建Service时,将父类修改为LifecycleService,其继承了Service并实现了LifecycleOwner接口,所以创建的Service作为被观察者。
public class LifecycleService extends Service implements LifecycleOwner
完整代码如下所示:
public class MyService extends LifecycleService {
private static final String TAG = "MyService";
private MyServiceObserver myServiceObserver;
public MyService(){
myServiceObserver = new MyServiceObserver();
getLifecycle().addObserver(myServiceObserver);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/5 11:17 AM
**/
public class MyServiceObserver implements LifecycleObserver {
private static final String TAG = "MyServiceObserver";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void startService(){
Log.d(TAG,"在MyServiceObserver中监听到Service启动 ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stopService(){
Log.d(TAG,"在MyServiceObserver中监听到Service停止 ");
}
}
在Activity中创建两个按钮,一个启动Service,一个停止Service。
///启动Service
public void startService(View view) {
Intent intent = new Intent(LocationActivity.this,MyService.class);
startService(intent);
}
//关闭Service
public void stopService(View view) {
Intent intent = new Intent(LocationActivity.this,MyService.class);
stopService(intent);
}
可检测到如下输出
2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyService: onCreate
2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中监听到Service启动
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中监听到Service停止
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyService: onDestroy
可以看出,监听Service生命周期的方法与Activity和Fragment相似,只是需要自己修改父类,其背后的原理依然是观察者模式。
2、使用ProcessLifecycleOwner监听应用程序的生命周期
谷歌提供了一个名为ProcessLifecycleOwner 的类,来监听应用程序的生命周期,可以知道应用程序是处于前台还是后台,或者是从前台切换到后台时可以得到通知。下面介绍其使用方法。
第一步还是引入依赖,引入的依赖,与上面Service中引入的依赖相同。
完整代码如下:
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/5 11:46 AM
**/
public class MyLifeApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicatonOberver());
}
}
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/5 11:46 AM
**/
public class ApplicatonOberver implements LifecycleObserver {
private static final String TAG = "ApplicatonOberver";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate(){
Log.d(TAG,"onCreate in ApplicatonOberver");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart(){
Log.d(TAG,"onStart in ApplicatonOberver");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume(){
Log.d(TAG,"onResume in ApplicatonOberver");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause(){
Log.d(TAG,"onPause in ApplicatonOberver");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop(){
Log.d(TAG,"onStop in ApplicatonOberver");
}
/**
* 该方法永远不会被调用,因为系统不会分发ON_DESTROY事件
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(){
Log.d(TAG,"onDestroy in ApplicatonOberver");
}
}
可检测到一下结果:
APP刚启动时会依次执行以下三种方法
2020-08-05 11:52:18.253 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onCreate in ApplicatonOberver
2020-08-05 11:52:18.654 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:18.688 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver
APP切换到后台时会执行以下两种方法
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onPause in ApplicatonOberver
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStop in ApplicatonOberver
APP再次切换到前台时会执行以下两种方法
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver
可以看出,通过ProcessLifecycleOwner我们可以轻易地检测到APP合适从前台进入到后台,又是何时从后台进入前台,进而可以进行一些业务操作,并且不会增加耦合度。
- ProcessLifecycleOwner是针对整个应用程序的监听,与Activity无关。
- Lifecycle.Event.ON_CREATE只会调用一次,Lifecycle.Event.ON_DESTROY永远不会被调用。
- Lifecycle.Event.ON_START 和 Lifecycle.Event.ON_RESUME是一组,会依次调用,Lifecycle.Event.ON_START在Lifecycle.Event.ON_RESUME之前调用。
- Lifecycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_STOP是一组,会依次调用,而且Lifecycle.Event.ON_PAUSE在Lifecycle.Event.ON_STOP之前调用。