像Glide一样绑定Activity的生命周期

如何像Glide一样绑定Activity的生命周期呢,本文通过模拟Glide实现一个简单的绑定Activity生命周期的方法。本文尽量使用Glide一样的类名,删除不需要的业务,实现的思想大同小异。

1、业务类RequestManager

和Glide不同个,我们把业务类实现在RequestManager中,这里有几个生命周期的回调方法:
onStart()、onStop()、onDestory()
具体代码:

/**
 * 你的业务类,以及需要在生命周期做出想要反应处理
 */
public class RequestManager implements LifeCycleListener {
    private static final String TAG = RequestManager.class.getSimpleName();

    /**
     * 当然这里可能还有FragmentActivity,Fragment等参数,再此只给出一种方式,其他同理
     * @param activity 传入的上下文
     */
    public void bindFragment(Activity activity) {
        FragmentManager fragmentManager = activity.getFragmentManager();
        fragmentGet(fragmentManager, isActivityVisible(activity));
    }

    private void fragmentGet(FragmentManager fragmentManager, boolean activityVisible) {
        ManagerFragment current = new ManagerFragment();
        fragmentManager.beginTransaction().add(current, "managerLife").commitAllowingStateLoss();
        current.getLifeCycle().addListener(this);
    }

    private boolean isActivityVisible(Activity activity) {
        return !activity.isFinishing();
    }

    @Override
    public void onStart() {
        //do you buzz
        Log.i(TAG, "onStart: ");
    }

    /**
     * 当出现该函数时,可以暂停Glide网络图片的请求
     */
    @Override
    public void onStop() {
        //do you buzz
        Log.i(TAG, "onStop: ");
    }

    @Override
    public void onDestroy() {
        //do you buzz
        Log.i(TAG, "onDestroy: ");
    }
}

2、生命周期回调接口

在RequestManager的fragmentGet()方法中:
current.getLifeCycle().addListener(this);
RequestManager主要是实现了LifeCycleListener接口来获取生命周期,接口很简单:

public interface LifeCycleListener {
    /**
     * Callback for when {@link android.app.Fragment#onStart()}} or {@link
     * android.app.Activity#onStart()} is called.
     */
    void onStart();

    /**
     * Callback for when {@link android.app.Fragment#onStop()}} or {@link
     * android.app.Activity#onStop()}} is called.
     */
    void onStop();

    /**
     * Callback for when {@link android.app.Fragment#onDestroy()}} or {@link
     * android.app.Activity#onDestroy()} is called.
     */
    void onDestroy();
}

3、获取生命周期的类ManagerFragment

继续观察RequestManager的fragmentGet()方法:
current.getLifeCycle().addListener(this);
current是ManagerFragment实例,MangerFragment其实就是Fragment:

/**
 * 就是通过把该Fragment添加到Activity或其他上下文中来获取生命周期,然后让RequestManager
 */
public class ManagerFragment extends Fragment {
    private ActivityFragmentLifeCycle lifecycle;
    public ManagerFragment() {
        this(new ActivityFragmentLifeCycle());
    }

    @SuppressLint("ValidFragment")
    public ManagerFragment(@NonNull ActivityFragmentLifeCycle lifeCycle) {
        this.lifecycle = lifeCycle;
    }

    @NonNull
    ActivityFragmentLifeCycle getLifeCycle() {
        return lifecycle;
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

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

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

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

其实就是创建了一个没有页面的Fragment,通过Fragment的生命周期来设置Glide的生命周期。

4、最后是ActivityFragmentLifeCycle

这个类可以不写,只是在ManagerFragment中需要设置一个无参构造函数,防止在调用ActivityFragmentLifeCycle时使用了无参构造函数,所以增加了一个持有LifeCycleListener的类:

public class ActivityFragmentLifeCycle {
    private LifeCycleListener lifecycleListener;

    public void addListener(@NonNull LifeCycleListener listener) {
        lifecycleListener = listener;
    }

    void onStart() {
        lifecycleListener.onStart();

    }

    void onStop() {
        lifecycleListener.onStop();

    }

    void onDestroy() {
        lifecycleListener.onDestroy();
    }
}

在glide中该类中有个集合类,通过addListener()方法可知可以添加多个生命周期的接口,但此处简化,只有一个地方监听。

5、最后使用

很简单,直接绑定下就可以了:

RequestManager requestManager = new RequestManager();
requestManager.bindFragment(this);

本文只是大致梳理了下Glide的生命周期,具体细节并未考虑。

你可能感兴趣的:(Glide,绑定生命周期,Android开发)