android 绑定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);