Jetpack - Lifecycle入门 看这一篇就够了

266 阅读2分钟

简介

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(){}

}