免费微信网站开发/网络营销外包推广
前言
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;}@Overridepublic void OnCreate(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnCreate");}@Overridepublic void OnDestroy(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnDestroy");}@Overridepublic void OnPause(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnPause");}@Overridepublic void OnResume(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnResume");}@Overridepublic void OnStart(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnStart");}@Overridepublic void OnStop(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnStop");}@Overridepublic void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {Log.d(TAG,Name+":OnLifeCycleChanged");}
}
(3)在Presenter中监听Activity的生命周期
public class MainActivity extends AppCompatActivity {private IPresenter mPresenter;@Overrideprotected 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@Overridepublic 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);}@Overridepublic void OnCreate(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnCreate");}@Overridepublic void OnDestroy(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnDestroy");}@Overridepublic void OnPause(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnPause");}@Overridepublic void OnResume(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnResume");}@Overridepublic void OnStart(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnStart");}@Overridepublic void OnStop(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnStop");}@Overridepublic void OnLifeCycleChanged(@NonNull LifecycleOwner owner) {Log.d(TAG,"OnLifeCycleChanged");}
}