打赏

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);


posted @ 2022-01-10 16:32  张学涛  阅读(227)  评论(0编辑  收藏  举报