模仿Glide监听Activity的生命周期

实现原理

由文档得知,Glide可以根据Activity的生命周期自动停止或重新加载图片,但使用Glide时并不需要我们手动监听Activity的生命周期,那Glide是怎样实现的呢?

通过梳理源码,Glide实现非侵入式监听Activity生命周期的流程如下:

  1. 调用者传入Activity对象
  2. [重点]Activity中添加一个NoneUiFragment
  3. 通过NoneUiFragment监听Activity的生命周期

代码实现

第1步:创建LifecycleFragment

/**
 * 创建一个LifecycleFragment,用于绑定Activity的生命周期
 * 并通过LifecycleListener接口将监听结果返回给调用者
 */
public class LifecycleFragment extends Fragment {

    private LifecycleListener lifecycleListener;

    public void setLifecycleListener(LifecycleListener lifecycleListener) {
        this.lifecycleListener = lifecycleListener;
    }

    @Override
    public void onStart() {
        super.onStart();
        lifecycleListener.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        lifecycleListener.onStop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        lifecycleListener.onDestroy();
    }

    /**
     * 监听LifecycleFragment生命周期的接口
     */
    public interface LifecycleListener {

        void onStart();

        void onStop();

        void onDestroy();
    }
}

注入LifecycleFragment到Activity

public class MyGlide implements LifecycleFragment.LifecycleListener {

    /**
     * 添加LifecycleFragment到目标Activity中,
     * 用于绑定目标Activity的生命周期
     */
    public void with(FragmentActivity activity) {
        //
        LifecycleFragment fragment = new LifecycleFragment();
        fragment.setLifecycleListener(MyGlide.this); // 添加生命周期接口回调
        activity.getSupportFragmentManager()
                .beginTransaction()
                .add(fragment, LifecycleFragment.class.getName())
                .commitAllowingStateLoss();
    }


    @Override
    public void onStart() {
        Log.i("Haoxueren", "onStart: ");
    }


    @Override
    public void onStop() {
        Log.i("Haoxueren", "onStop: ");
    }

    @Override
    public void onDestroy() {
        Log.i("Haoxueren", "onDestroy: ");
    }
}

你可能感兴趣的:(模仿Glide监听Activity的生命周期)