前言
Google I/O 2017提出的Android新体系架构Lifecycle其根本目的是实现Activity和Fragment的生命周期与逻辑的解耦,也可以在自定义View中实现监听Activity或者Fragment的生命周期(注意你获取的Lifecycle对象来自哪里就是监听的哪一个Activity或者Fragment).在MVP架构中我们就可以实现在Presenter中监听Activity和Fragment的生命周期,这样也就做到了解耦合.
Lifecycle观察的几种状态
- ON_CREATE:关联onCreate事件
- ON_START:关联onStart事件
- ON_RESUME:关联onResume事件
- ON_PAUSE:关联onPause事件
- ON_STOP:关联onStop事件
- ON_DESTROY:关联onDestroy事件
- ON_ANY:关联所有的生命周期的事件,可用于检查状态改变
Lifecycle相关的类
- Lifecycle 用于添加或移除观察对象,获取当前状态,且包含了观察状态的枚举类
- LifecycleOwner 一个接口,只含有一个方法获取Lifecycle对象的方法
- LifecycleObserver 一个接口,其本身不含有任何方法,只是用于标记这个类是一个生命周期的观察类
- LifecycleRegistry 用于自定义一个生命周期的观察类
Lifecycle的使用
(1)创建一个接口实现LifecycleObserver
public interface IPresenter extends LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
default void OnCreate(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
default void OnDestroy(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
default void OnPause(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
default void OnResume(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
default void OnStart(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
default void OnStop(@NonNull LifecycleOwner owner){}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
default void OnLifeCycleChanged(@NonNull LifecycleOwner owner){}
}
(2)创建一个IPresenter的实现类
public class PresenterImpl implements IPresenter {
private String TAG = "Test";
private String Name;
public PresenterImpl(String name){
this.Name = name;
}
@Override
public void OnCreate(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnCreate");
}
@Override
public void OnDestroy(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnDestroy");
}
@Override
public void OnPause(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnPause");
}
@Override
public void OnResume(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnResume");
}
@Override
public void OnStart(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnStart");
}
@Override
public void OnStop(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnStop");
}
@Override
public void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {
Log.d(TAG,Name+":OnLifeCycleChanged");
}
}
(3)在Presenter中监听Activity的生命周期
public class MainActivity extends AppCompatActivity {
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPresenter = new PresenterImpl("MainActivity");
getLifecycle().addObserver(mPresenter);
}
}
(4)在Presenter中监听Fragment的生命周期
public class MFragment extends Fragment {
private IPresenter mPresenter;
private View mRootView;
private MTextView mTextView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(mRootView==null){
mRootView = inflater.inflate(R.layout.fragment_test,container,false);
mPresenter = new PresenterImpl("MFragment");
getLifecycle().addObserver(mPresenter);
mTextView = mRootView.findViewById(R.id.textView);
mTextView.setLifecycle(getLifecycle());
}
return mRootView;
}
}
(5)在自定义View中监听Activity或者Fragment的生命周期
这里我们通过setLifecycle方法为View设置监听(这里的lifecycle如果是来自Activity的则监听的是该Activity的生命周期,如果来自Fragment则是监听该Fragment的生命周期)
public class MTextView extends AppCompatTextView implements IPresenter {
private String TAG = "Test";
public MTextView(Context context) {
this(context,null);
}
public MTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setLifecycle(Lifecycle lifecycle){
lifecycle.addObserver(this);
}
@Override
public void OnCreate(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnCreate");
}
@Override
public void OnDestroy(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnDestroy");
}
@Override
public void OnPause(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnPause");
}
@Override
public void OnResume(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnResume");
}
@Override
public void OnStart(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnStart");
}
@Override
public void OnStop(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnStop");
}
@Override
public void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {
Log.d(TAG,"OnLifeCycleChanged");
}
}