Lifecycle生命周期感知组件
传统的MVP结构,P层需要在打开页面时进行一些网络或者其它操作,或者在页面销毁前释放资源,需要和activity/fragment进行生命周期绑定,可通过如下代码。
public class HomeActivity extends AppCompatActivity {
private HomePresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mPresenter = new HomePresenter();
mPresenter.onCreate();
}
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.onDestroy();
}
}
public class HomePresenter {
public HomePresenter() {
}
protected void onCreate() {
//加载数据
}
protected void onDestroy() {
//释放资源
}
}
Google 在2018的IO大会上推出了Lifecycle生命周期感知组件。
- 需要监听activity/fragment的观察者,实现LifecycleObserver接口
- 被观察者activity/fragment,添加观察者对象,getLifecycle().addObserver(observer)
- 监听的Event事件有:ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY,定义在Lifecycle.Event中,枚举类型
使用举例:
public class HomeActivity extends AppCompatActivity {
private String TAG = "xzz HomeActivity";
private HomePresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mPresenter = new HomePresenter();
getLifecycle().addObserver(mPresenter); //关键代码
Log.d(TAG, "onCreate");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
public class HomePresenter implements LifecycleObserver {
private String TAG = "xzz HomePresenter";
public HomePresenter() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreate() {
Log.w(TAG, "onCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void onDestroy() {
Log.w(TAG, "onDestroy");
}
}
源码分析:
Fragment
Fragment实现了LifecycleOwner接口,返回一个mLifecycleRegistry对象。
系统回调Fragment的各个方法,会回调mLifecycleRegistry的相关方法,和Fragment的生命周期方法。
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner {
LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
void performCreate(Bundle savedInstanceState) {
mState = CREATED;
onCreate(savedInstanceState); //回调Fragment的onCreate
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); //分发ON_CREATE事件
}
void performStart() {
mState = STARTED;
onStart();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
void performResume() {
mState = RESUMED;
onResume();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
void performPause() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
mState = STARTED;
onPause();
}
void performStop() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
mState = STOPPED;
onStop();
}
void performDestroy() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
mState = INITIALIZING;
onDestroy();
}
}
OnLifecycleEvent 是个运行时注解,作用于方法上。
在addObserver(lifecycleObserver)时,会通过反射获取lifecycleObserver的相应注解方法,保存在map中,分发事件时,再回调相应的监听事件。
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value(); //Lifecycle的这个六个Event,正是我们在presenter中监听的那些事件。
}
Activity的实现生命周期监听的原理:
在SupportActivity的onCreate()中,
Activity中getLifecycle(),回调到SupportActivity中。
public class SupportActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
@SuppressWarnings("RestrictedApi")
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry; //返回一个LifecycleRegistry对象,LifecycleRegistry继承自Lifecycle
}
}
ReportFragment#injectIfNeededIn(activity)
往activity中添加一个ReportFragment,所以监听activity的生命周期相当于监听fragment的生命周期。
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
public static void injectIfNeededIn(Activity activity) {
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
// Hopefully, we are the first to make a transaction.
manager.executePendingTransactions();
}
}
static ReportFragment get(Activity activity) {
return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
REPORT_FRAGMENT_TAG);
}