前言:
此架构,可复用
案例:
1.FingerprintEnrollBase extends InstrumentedActivity
2.InstrumentedActivity extends ObservableActivity
3.ObservableActivity extends Activity
注:代码源于8.1的SettingsLib模块
框架:

分析:
1.看继承Activity的ObservableActivity
/**
* {@link Activity} that has hooks to observe activity lifecycle events.
*/
public class ObservableActivity extends Activity {
private final Lifecycle mLifecycle = new Lifecycle();
protected Lifecycle getLifecycle() {
return mLifecycle;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mLifecycle.onAttach(this);
super.onCreate(savedInstanceState);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState,
@Nullable PersistableBundle persistentState) {
mLifecycle.onAttach(this);
super.onCreate(savedInstanceState, persistentState);
}
@Override
protected void onStart() {
mLifecycle.onStart();
super.onStart();
}
@Override
protected void onResume() {
mLifecycle.onResume();
super.onResume();
}
@Override
protected void onPause() {
mLifecycle.onPause();
super.onPause();
}
@Override
protected void onStop() {
mLifecycle.onStop();
super.onStop();
}
@Override
protected void onDestroy() {
mLifecycle.onDestroy();
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
if (super.onCreateOptionsMenu(menu)) {
mLifecycle.onCreateOptionsMenu(menu, null);
return true;
}
return false;
}
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
if (super.onPrepareOptionsMenu(menu)) {
mLifecycle.onPrepareOptionsMenu(menu);
return true;
}
return false;
}
@Override
public boolean onOptionsItemSelected(final MenuItem menuItem) {
boolean lifecycleHandled = mLifecycle.onOptionsItemSelected(menuItem);
if (!lifecycleHandled) {
return super.onOptionsItemSelected(menuItem);
}
return lifecycleHandled;
}
}
2.关键看Lifecycle对象,我们看一下Lifecycle代码
public class Lifecycle {
protected final List<LifecycleObserver> mObservers = new ArrayList<>();
/**
* Registers a new observer of lifecycle events.
*/
@UiThread
public <T extends LifecycleObserver> T addObserver(T observer) {
ThreadUtils.ensureMainThread();
mObservers.add(observer);
return observer;
}
public void onAttach(Context context) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnAttach) {
((OnAttach) observer).onAttach(context);
}
}
}
public void onCreate(Bundle savedInstanceState) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnCreate) {
((OnCreate) observer).onCreate(savedInstanceState);
}
}
}
public void onStart() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnStart) {
((OnStart) observer).onStart();
}
}
}
public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof SetPreferenceScreen) {
((SetPreferenceScreen) observer).setPreferenceScreen(preferenceScreen);
}
}
}
public void onResume() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnResume) {
((OnResume) observer).onResume();
}
}
}
public void onPause() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnPause) {
((OnPause) observer).onPause();
}
}
}
public void onSaveInstanceState(Bundle outState) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnSaveInstanceState) {
((OnSaveInstanceState) observer).onSaveInstanceState(outState);
}
}
}
public void onStop() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnStop) {
((OnStop) observer).onStop();
}
}
}
public void onDestroy() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnDestroy) {
((OnDestroy) observer).onDestroy();
}
}
}
public void onCreateOptionsMenu(final Menu menu, final @Nullable MenuInflater inflater) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnCreateOptionsMenu) {
((OnCreateOptionsMenu) observer).onCreateOptionsMenu(menu, inflater);
}
}
}
public void onPrepareOptionsMenu(final Menu menu) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnPrepareOptionsMenu) {
((OnPrepareOptionsMenu) observer).onPrepareOptionsMenu(menu);
}
}
}
public boolean onOptionsItemSelected(final MenuItem menuItem) {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnOptionsItemSelected) {
if (((OnOptionsItemSelected) observer).onOptionsItemSelected(menuItem)) {
return true;
}
}
}
return false;
}
}
Lifecycle顾名思义生命周期,作用就是监听各种生命周期,方便事件跟着控件的生命周期走。
仔细跟着源码,你会发现很有趣。
我们从ObservablePreferenceFragment 中通过getLifecycle()获取到Lifecycle,再调用addObserver,就可以监听生命周期了。
3.我们继续看LifecycleObserver,是怎么实现的?
public interface LifecycleObserver {
}
LifecycleObserver 是一个空接口,它的意义是什么?
空接口的存在是为了起一种标识作用。标识某类如果实现该接口就会具备某种特性,可以做某些事。
这么做,其实java里面的Serializable.java也是这样做的
public interface Serializable {
}
4.addObserver进入列表中,怎么被执行?
我们用onStart作为案例分析:
1.调Activity生命周期onStart
protected void onStart() {
mLifecycle.onStart();
super.onStart();
}
2.调用到Lifecycle.onStart方法,此时方法里获取的observer对象是用来判断是否instanceof OnStart。
这里就有点挂"牛肉"卖"羊肉"的味道
public void onStart() {
for (int i = 0, size = mObservers.size(); i < size; i++) {
final LifecycleObserver observer = mObservers.get(i);
if (observer instanceof OnStart) {
((OnStart) observer).onStart();
}
}
}
3.从这里看出来,我们想要监听生命周期,除了implements LifecycleObserver之外,你必须再implements一个你需要监听的
生命周期。例如:
class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPause, OnAttach
通过addObserver(VisibilityLoggerMixin),便可以监听OnResume、OnPause、OnAttach生命周期
网友评论