文章目录
Lifecycle
组件中的类结构,LifecycleOwner
表示拥有生命周期功能。
Lifecycle
定义了Android中的生命周期的接口。而LifecycleObserver
是生命周期的监听的接口。Lifecycle
可以注册和反注册LifecycleObserver
,二者为观察者模式。
LifecycleOwner
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle();
}
LifecycleOwner
只有一个简单的接口,获取Lifecycle
。而support现在的库中的Fragment
和AppCompatActivity
均实现了此接口。
Fragment
现在的support库中的Fragment
实现了LifecycleOwner
,我们来观摩一下。
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
Fragment直接返回变量mLifecycleRegistry,
LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
变量是LifecycleRegistry
的对象。
Fragment
实现了LifecycleOwner
,并返回了LifecycleRegistry
类的对象。
那mLifecycleRegistry
怎么知道生命周期变化的呢?
在performCreate
方法中,调用支持onCreate
方法并使用mLifecycleRegistry
来处理Lifecycle.Event.ON_CREATE
。
void performCreate(Bundle savedInstanceState) {
······
onCreate(savedInstanceState);
······
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
同样的:
performStart
调用onStart
方法并使用mLifecycleRegistry
处理Lifecycle.Event.ON_START
performResume
调用onResume
方法并使用mLifecycleRegistry
处理Lifecycle.Event.ON_RESUME
performStop
调用onStop
方法并使用mLifecycleRegistry
处理Lifecycle.Event.ON_STOP
performDestroy
调用onDestroy
并使用mLifecycleRegistry
处理Lifecycle.Event.ON_DESTROY
调用生命周期的相关的方法的同时,也使用mLifecycleRegistry
处理Lifecycle.Event
中的相应事件。
mLifecycleRegistry
通过此种方式来监听生命周期的变更的。(至于什么时候执行performXX方法可以自行分析)。
AppCompatActivity
AppCompatActivity
继承关系比较深,最终基础类为SupportActivity
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
SupportActivity
也是返回LifecycleRegistry
返回。但是使用的Fragment
来监听的生命周期。
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
其实委托给ReportFragment
处理生命周期。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
在onActivityCreated
方法中调用dispatch
方法分发Lifecycle.Event.ON_CREATE
事件。
private void dispatch(Lifecycle.Event event) {
Activity activity = getActivity();
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
//SupportActivity实现了LifecycleOwner,会调用此代码
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
SupportActivity
实现了LifecycleOwner
方法,最终会调用到SupportActivity
的mLifecycleRegistry
处理事件。
类似:
onStart
方法中发送Lifecycle.Event.ON_CREATE
事件。onResume
方法中发送Lifecycle.Event.ON_RESUME
事件。onPause
方法中发送Lifecycle.Event.ON_PAUSE
事件。onStop
方法中发送Lifecycle.Event.ON_STOP
事件。onDestroy
方法中发送Lifecycle.Event.ON_DESTROY
事件。
SupportActivity
通过ReportFragment
间接处理生命周期的监听。
但还有个问题
protected void onSaveInstanceState(Bundle outState) {
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
super.onSaveInstanceState(outState);
}
通过onSaveInstanceState()
保存AppCompatActivity
的状态时,在调用ON_START
事件之前,UI认为是不可变的。在onSaveInstanceState()
之后才会调用AppCompatActivity
的onStop()
方法,在不允许UI状态更改,但是Lifecycle
尚未移到CREATED
状态(AppCompatActivity
的onStop()
方法尚未调用)的存在间隙。
为了防止UI变更,因此这里标记了状态为Lifecycle.State.CREATED
。
Lifecycle
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract State getCurrentState();
}
Lifecycle
定义了生命周期类。用于派发生命周期。包含三个方法addObserver
添加观察者,removeObserver
移除观察者,getCurrentState
获取当前的状态。
LifecycleRegistry
实现了此接口。可以直接使用它来定义自己的LifecycleOwner
。
LifecycleRegistry
我们先跟踪事件处理的逻辑。
分析LifecycleRegistry的实现
假设我们继承Frgment
并添加LifecycleObserver
class LifeycycleFragment : Fragment() {
private val mLifecycleObserver: LifecycleObserver = GenericLifecycleObserver {
source, event ->
Log.d("LifeycycleFragment", "source:$source event:$event")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(mLifecycleObserver)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_lifecycle, container, false)
}
override fun onDestroy() {
lifecycle.