JetPack学习笔记

JetPack学习笔记之LifeCyCle(一)

2020-08-05  本文已影响0人  秀儿2020

JetPack学习笔记之LifeCyCle(一)

1、为什么要用LifeCycle,是为了解决什么问题?

普通组件在使用过程中通常需要依赖于系统组件的生命周期,有时候,我们不得不在系统组件的生命周期回调方法中,主动去调用普通组件的方法,或者对其进行控制,因为普通组件无法获知系统组件生命周期事件。

我们希望我们自己定义的组件,不依赖于页面生命周期的“回调方法”,在页面生命周期变化的时候,就可以收到通知,这在组件化和架构设计中显得尤为重要。这就是谷歌提供LiftCycle的初衷。

2、使用LifeCycle解决问题的案例

假设有这样一个常见的需求:在用户打开某个页面时,获取用户当前的地理位置,面对该需求,之前的做法如下:

public class LocationActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);

        //在页面创建时 初始化定位管理信息
        initLocation();
    }

    @Override
    protected void onResume() {
        super.onResume();
        ///在页面显示时 开始定位
        startLocation();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在页面销毁时停止定位
        stopLocation();
    }
}

以上可以看出,在Activity中必须含有定位对象,才可以完成相关的调用,耦合度较高。而且除了定位对象,可能还会包含一些其他的对象,会导致在Activity的生命周期回调方法中添加了太多其他的组件管理,原因仅仅是组件不能感知Activity生命周期的变化。

下面是使用LifeCycle后的做法:

/**
 * 项目名称 JetPackPro
 * 创建人 xiaojinli
 * 创建时间 2020/8/5 10:10 AM
 **/
public class MyLocationListener implements LifecycleObserver {
    public static final String TAG = "MyLocationListener";

    //使用注解,使得在create时调用
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void initLocation(){
        Log.d(TAG,"initLocation");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void startLocation(){
        Log.d(TAG,"startLocation");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void stopLocation(){
        Log.d(TAG,"stopLocation");
    }
}

Activity类修改为:

public class LocationActivity extends AppCompatActivity {
    private static final String TAG = "LocationActivity";
    public MyLocationListener myLocationListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);

        //初始化定位对象
        myLocationListener = new MyLocationListener();
        getLifecycle().addObserver(myLocationListener);

        Log.d(TAG,"onCreate");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}

生命周期监听结果

2020-08-05 10:25:39.571 32500-32500/com.example.jetpackpro D/LocationActivity: onCreate
2020-08-05 10:25:39.571 32500-32500/com.example.jetpackpro D/MyLocationListener: initLocation
2020-08-05 10:25:39.577 32500-32500/com.example.jetpackpro D/LocationActivity: onResume
2020-08-05 10:25:39.577 32500-32500/com.example.jetpackpro D/MyLocationListener: startLocation
2020-08-05 10:25:55.582 32500-32500/com.example.jetpackpro D/MyLocationListener: stopLocation
2020-08-05 10:25:55.582 32500-32500/com.example.jetpackpro D/LocationActivity: onDestroy

可以看出,只需要在Activity中注册定位对象,就可以在定位对象中,接收到Activity生命周期的变化通知。

3、LifeCycle原理

本质是观察者模式,Activity作为被观察者,普通组件作为观察者。

查看源码可以发现,Activity中实现了LifecycleOwner接口,该接口中只有一个方法,即getLifecycle()方法。

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
        
        
        、、、、
        
        }  
public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}
4、在Fragment中的使用方法与Activity中的使用方法相同,因为Fragment也实现了LifecycleOwner接口
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
        ViewModelStoreOwner, SavedStateRegistryOwner
上一篇下一篇

猜你喜欢

热点阅读