简介
LifeCycle是Google提供的一个解决方案,为了降低基础组件与自定义组件之间的耦合度,并降低内存泄漏发送的可能性。
LifeCycle用来创建可感知生命周期的组件,使其能够在内部管理自己的生命周期。
1、LifeCycle在Activity/Fragment中的运用:
案例分析:
需求:打开某个页面,获取用户当前地理位置。
通常写法是这样的
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
//初始化位置管理器
initLocationManager();
}
@Override
protected void onResume(){
//开始获取用户的地理位置
startGetLocation();
}
@Override
protected void onPause(){
//停止获取用户的地理位置
stopGetLocation();
}
}
痛点:获取地理位置功能与页面生命周期息息相关,且高度耦合
Jetpack提供了两个类:通过观察者模式,实现对页面生命周期的监听
-
LifecycleOwner(被观察者) - Activity/Fragment
-
LifecycleObserver(观察者)- 自定义组件
//SupportActivity 默认实现了LifecycleOwner接口
public class SupportActivity extends Activity implements LifecycleOwner,Component{
…
public SupportActivity(){}
private LifecycleRegistry mLifecycleRegistry = new LifecyeleRegistry(this);
public LifecycleOwner getLifecycle(){
return mLifecycleRegistry;
}
}
Fragment 也默认实现了LifecycleOwner接口
public class Fragment implements ComponentCallback,OnCreateContextMenuListener,LifecycleOwner,ViewModelStoreOwner{
…
private LifecycleRegistry mLifecycleRegistry = new LifecyeleRegistry(this);
public LifecycleOwner getLifecycle(){
return this.mLifecycleRegistry;
}
}
//创建自定义组件
public class MyLocationListener implements LifecycleObserver{
public MyLocationListener(Activity context, OnLocationChangeListener onLocationChangeListener){
//初始化操作
initLocationManager();
}
//当Activity执行onResume()方法时,该方法会自动调用
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void startGetLocation(){}
//当Activity执行onPause()方法时,该方法会自动调用
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void stopGetLocation(){}
//当地理位置发生变化时,通过该接口通知调用者
public interface OnLocationChangeListener{
onChange(double lat,double lon);
}
}
public class MainActivity extends AppComatActivity{
private MyLocationListener myLocationListener;
@Override
protected void onCreate(Bundle savedInstanceState){
myLocationListener = new MyLocationListener(this,new MyLocationListener.OnLocationChangeListener(){
@Override
public void onChange(double lat,double lon){
//展示收到的位置信息
}
}
);
//将观察者与被观察者绑定
getLifecycle().addObserver(myLocationListener);
}
}
2、LifeCycle 在Service中的运用:
//LifecycleService 也默认实现了LifecycleOwner接口
public class LifecycleService extents Service implements LifecycleOwner{
…
private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher();
@Override
public LifecycleOwner getLifecycle(){
return mDispatcher.mLifecycleRegistry;
}
}
首先需要在app的build.gradle中添加依赖
dependencies{
implementation “androidx.lifecycle:lifecycle-extensions:2.2.0"
}
public class MyService extends LifecycleService{
private MyServiceObserver myServiceObserver;
public MyService(){
myServiceObserver = new MyServiceObserver();
//将观察者与被观察者绑定
getLifecycle().addObserver(myServiceObserver);
}
}
public class MyServiceObserver implements LifecycleObserver{
//当Service执行onCreate()方法时,该方法会自动调用
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void startGetLocation(){}
//当Service执行onDestroy()方法时,该方法会自动调用
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void stopGetLocation(){}
}
3、LifeCycle 在Application中的运用:
使用ProcessLifecycleOwner类,可以方便的知道我们的整个应用程序的生命周期情况。
首先需要在app的build.gradle中添加依赖
dependencies{
implementation “androidx.lifecycle:lifecycle-extensions:2.2.0"
}
public class MyApplication extends Application{
@Override
public void onCreate(){
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
}
}
public class ApplicationObserver implements LifecycleObserver{
//在应用程序的整个生命周期中只会被调用一次
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreate(){}
//当应用程序在前台出现时被调用 - 1
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onStart(){}
//当应用程序在前台出现时被调用 - 2
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void onResume(){}
//当应用程序退出到后台时被调用 - 1
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void onPause(){}
//当应用程序退出到后台时被调用 - 2
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onStop(){}
//永远不会被调用,系统不会分发调用onDestroy事件
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void onDestroy(){}
}