1.問題引入
通常我們都會用MVP模式把業(yè)務邏輯和數(shù)據(jù)處理分開,但是這樣做有個小問題:如果在某個生命周期還有別的類要監(jiān)聽 Activity 生命周期變化,那也需要添加許多生命周期的回調(diào)方法,比較繁瑣。那我們是否可以當 Activity 生命周期發(fā)生變化的時候主動通知呢?答案就是使用 Lifecycle 提供的 LifecycleObserver
2.Lifecycle使用
(1)和MVP一樣,要有一個最基礎的接口
public interface BasePresenter {
void onCreate();
void onStart();
void onResume();
void onPause();
void onStop();
void onDestroy();
}
(2)實例化presenter并且還要實現(xiàn)Lifecycle接口
/**
* 如果是java8的話就用DefaultLifecycleObserver
*/
public class MainActivityObserver implements BasePresenter, LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
@Override
public void onCreate() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
@Override
public void onStart() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@Override
public void onResume() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@Override
public void onPause() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
@Override
public void onStop() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
@Override
public void onDestroy() {
}
}
(3)在Activity里面使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MainActivityObserver());
}
}
3.源碼解析
1.getLifecycle的實現(xiàn)
最終是在SupportActivity里面實現(xiàn)的
public class SupportActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
//橫豎屏切換的時候
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
super.onSaveInstanceState(outState);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
為什么只在SupportActivity里面實現(xiàn)呢?如果我一開始繼承的是Activity呢?其實,Google工作人員表示開發(fā)Lifecycle并沒有針對android.app.* Activity和Fragment,近期也未打算支持android.app.*。具體參見官方解釋。這里推薦大家更多的使用support包,不同版本platform中Activity和Fragment還存在大量support包中已修復的bug。
所以為了安全性以及版本的兼容,仿照這個推薦自己實現(xiàn)LifecycleRegistry
注意看ReportFragment。很明顯就是用來處理生命周期的
public class ReportFragment extends Fragment {
private ActivityInitializationListener mProcessListener;
private void dispatchCreate(ActivityInitializationListener listener) {
if (listener != null) {
listener.onCreate();
}
}
private void dispatchStart(ActivityInitializationListener listener) {
if (listener != null) {
listener.onStart();
}
}
private void dispatchResume(ActivityInitializationListener listener) {
if (listener != null) {
listener.onResume();
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatchStart(mProcessListener);
dispatch(Lifecycle.Event.ON_START);
}
@Override
public void onResume() {
super.onResume();
dispatchResume(mProcessListener);
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
@Override
public void onStop() {
super.onStop();
dispatch(Lifecycle.Event.ON_STOP);
}
@Override
public void onDestroy() {
super.onDestroy();
dispatch(Lifecycle.Event.ON_DESTROY);
mProcessListener = null;
}
private void dispatch(Lifecycle.Event event) {
Activity activity = getActivity();
......
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
void setProcessListener(ActivityInitializationListener processListener) {
mProcessListener = processListener;
}
interface ActivityInitializationListener {
void onCreate();
void onStart();
void onResume();
}
}
很明顯,調(diào)用了生命周期函數(shù),同時也調(diào)用了自身的處理生命周期的函數(shù)
接下來看handleLifecycleEvent
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
最終會調(diào)用ObserverWithState.dispatchEvent
2.addObserver分析
@Override
public void addObserver(LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
statefulObserver.dispatchEvent(mLifecycleOwner, upEvent(statefulObserver.mState));
//也就是ObserverWithState.dispatchEvent
popParentState();
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
// we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}
看一下ObserverWithState
static class ObserverWithState {
State mState;
GenericLifecycleObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.getCallback(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
//也就是GenericLifecycleObserver的onStateChanged,但是沒有實現(xiàn)
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
3.總結(jié)
Lifecycle內(nèi)部的實現(xiàn)機制就是用ReportFragment來響應生命周期的(和Glide有點類似)。當然,光一個Lifecycle看不出什么,如果和LiveData和ViewModel一起用就會很好