一、状态同步核心机制
1. 状态机模型设计
Lifecycle 采用有限状态机模型管理生命周期状态,状态定义如下:
arduino
public enum State {
DESTROYED, // 已销毁
INITIALIZED, // 已初始化
CREATED, // 已创建
STARTED, // 已启动
RESUMED; // 已恢复
}
状态转换规则严格遵循 Android 生命周期逻辑:
DESTROYED ← ON_DESTROY ← CREATED ← ON_STOP ← STARTED ← ON_PAUSE ← RESUMED
ON_CREATE → ON_START → ON_RESUME →
2. 状态同步算法
状态同步在 LifecycleRegistry.sync()
中实现,采用双向渐进式同步算法:
scss
// LifecycleRegistry.java
private void sync() {
while (!isSynced()) {
// 向后回退状态 (RESUMED → STARTED → CREATED)
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass();
}
// 向前推进状态 (CREATED → STARTED → RESUMED)
if (mState.compareTo(mObserverMap.newest().getValue().mState) > 0) {
forwardPass();
}
}
}
3. 状态同步流程详解
场景示例:当 Activity 从 RESUMED 转到 STARTED 状态时:
-
事件触发 :
ReportFragment.onPause()
调用dispatch(ON_PAUSE)
-
状态计算:
lesspublic void handleLifecycleEvent(@NonNull Lifecycle.Event event) { State next = getStateAfter(event); // ON_PAUSE → RESUMED → STARTED moveToState(next); }
-
状态迁移:
scssprivate void moveToState(State next) { if (mState == next) return; mState = next; // 更新当前状态为STARTED if (!isSynced()) { sync(); // 触发状态同步 } }
-
同步执行:
- 检测到当前状态(STARTED) < 最新观察者状态(RESUMED)
- 调用
backwardPass()
执行状态回退
4. 双向同步实现
向前同步 (forwardPass)
scss
private void forwardPass(LifecycleOwner lifecycleOwner) {
Iterator<...> ascendingIterator = mObserverMap.iteratorWithAdditions();
while (ascendingIterator.hasNext()) {
ObserverWithState observer = entry.getValue();
// 逐步提升观察者状态
while (observer.mState.compareTo(mState) < 0) {
pushParentState(observer.mState);
final Event event = Event.upFrom(observer.mState);
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
}
}
}
向后同步 (backwardPass)
scss
private void backwardPass(LifecycleOwner lifecycleOwner) {
Iterator<...> descendingIterator = mObserverMap.descendingIterator();
while (descendingIterator.hasNext()) {
ObserverWithState observer = entry.getValue();
// 逐步降低观察者状态
while (observer.mState.compareTo(mState) > 0) {
final Event event = Event.downFrom(observer.mState);
pushParentState(event.getTargetState());
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
}
}
}
二、事件分发机制
1. 事件分发流程
scss
系统回调 → ReportFragment/Fragment → LifecycleRegistry.handleLifecycleEvent()
→ moveToState() → sync() → forwardPass()/backwardPass()
→ ObserverWithState.dispatchEvent()
→ LifecycleEventObserver.onStateChanged()
2. 观察者通知机制
ObserverWithState 实现
ini
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState); // 防止状态跳跃
mLifecycleObserver.onStateChanged(owner, event);
mState = newState; // 更新观察者状态
}
}
事件到方法映射
typescript
// Lifecycling 类中
static LifecycleEventObserver lifecycleEventObserver(Object object) {
// 处理注解方式
if (object instanceof LifecycleObserver) {
return new ReflectiveGenericLifecycleObserver(object);
}
// 处理接口方式
if (object instanceof LifecycleEventObserver) {
return (LifecycleEventObserver) object;
}
// ...
}
// 反射实现注解处理
class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
private final CallbackInfo mInfo;
private final Object mWrapped;
public void onStateChanged(LifecycleOwner source, Event event) {
mInfo.invokeCallbacks(source, event, mWrapped);
}
}
3. 分发优先级控制
Lifecycle 维护三个观察者列表,按优先级分发:
scss
// 实际实现使用自定义数据结构,此处简化为列表
List<ObserverWithState> mHighPriorityObservers; // 高优先级
List<ObserverWithState> mNormalPriorityObservers; // 中优先级
List<ObserverWithState> mLowPriorityObservers; // 低优先级
void dispatchEvent(Event event) {
// 高优先级最先通知
for (ObserverWithState observer : mHighPriorityObservers) {
observer.dispatchEvent(owner, event);
}
// 中优先级
for (ObserverWithState observer : mNormalPriorityObservers) {
observer.dispatchEvent(owner, event);
}
// 低优先级最后通知
for (ObserverWithState observer : mLowPriorityObservers) {
observer.dispatchEvent(owner, event);
}
}
三、关键设计亮点
1. 状态一致性保障机制
csharp
private void sync() {
// 检查同步过程中是否有新事件
if (mNewEventOccurred) {
return; // 放弃当前同步,重新开始
}
// 状态版本号校验
int expectedVersion = mVersion;
if (expectedVersion != mCurrentVersion) {
throw new IllegalStateException("Lifecycle state change detected during sync");
}
// 原子性标记
mSyncing.set(true);
try {
// 同步逻辑...
} finally {
mSyncing.set(false);
mCurrentVersion++;
}
}
2. 内存安全防护
scala
public class LifecycleRegistry extends Lifecycle {
private final WeakReference<LifecycleOwner> mLifecycleOwner;
void sync() {
LifecycleOwner owner = mLifecycleOwner.get();
if (owner == null) {
// 宿主被回收,清理资源
mObserverMap.clear();
return;
}
// ...
}
}
3. 状态跳跃防护
scss
void dispatchEvent(LifecycleOwner owner, Event event) {
State nextState = getStateAfter(event);
// 检查状态跳跃
if (mState != DESTROYED && nextState == DESTROYED) {
throw new IllegalStateException("Cannot move to DESTROYED state without proper sequence");
}
// 分步迁移
while (mState != nextState) {
State intermediate = calculateIntermediate(mState, nextState);
dispatchIntermediateEvent(owner, intermediate);
}
}
四、性能优化策略
1. 观察者状态缓存
ini
private static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
// 缓存状态比较结果
private int mLastComparison = Integer.MIN_VALUE;
boolean needsUpdate(State newState) {
if (mLastComparison == Integer.MIN_VALUE) {
return true;
}
int comparison = mState.compareTo(newState);
if (comparison != mLastComparison) {
mLastComparison = comparison;
return true;
}
return false;
}
}
2. 增量同步机制
scss
private void sync() {
// 只同步需要更新的观察者
List<ObserverWithState> toUpdate = new ArrayList<>();
for (ObserverWithState observer : mObservers) {
if (observer.needsUpdate(mState)) {
toUpdate.add(observer);
}
}
// 按优先级排序
Collections.sort(toUpdate, mPriorityComparator);
// 批量更新
for (ObserverWithState observer : toUpdate) {
updateObserver(observer);
}
}
3. 事件分发优化
ini
void dispatchEvent(Event event) {
// 使用局部变量避免多次访问成员变量
final State currentState = mState;
final List<ObserverWithState> observers = mObserversSnapshot;
// 使用数组遍历代替迭代器
for (int i = 0, size = observers.size(); i < size; i++) {
ObserverWithState observer = observers.get(i);
if (observer.mState != currentState) {
observer.dispatchEvent(owner, event);
}
}
}
五、特殊场景处理
1. 配置变更处理
less
// ComponentActivity.java
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
// 处理配置变更
mSavedStateRegistryController.performRestore(savedInstanceState);
}
// 重新分发CREATE事件
ReportFragment.dispatch(this, Lifecycle.Event.ON_CREATE);
}
2. 观察者延迟添加
ini
public void addObserver(@NonNull LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
// 立即同步到当前状态
if (mState != initialState) {
boolean isReentrance = mAddingObserverCounter != 0;
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
while (statefulObserver.mState != targetState) {
pushParentState(statefulObserver.mState);
statefulObserver.dispatchEvent(upEvent(statefulObserver.mState));
popParentState();
}
mAddingObserverCounter--;
}
}
3. 多线程安全
ini
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
synchronized (mLock) {
State next = getStateAfter(event);
if (mHandlingEvent || mAddingObserverCounter != 0) {
mNewEventOccurred = true;
mPendingState = next;
return;
}
mHandlingEvent = true;
moveToState(next);
mHandlingEvent = false;
}
}
六、设计思想总结
-
状态机驱动:
- 严格的状态转换规则确保生命周期有序性
- 状态作为系统唯一可信源
-
渐进式同步:
- 双向同步算法保证状态迁移完整性
- 最小化事件分发次数
-
优先级控制:
- 三级优先级满足不同业务需求
- 确保关键观察者优先响应
-
异常防护:
- 状态跳跃检测
- 内存泄漏防护
- 线程安全保证
-
性能优化:
- 增量同步机制
- 状态变更缓存
- 批量事件处理