公司动态

android_状态机

📅 2026/8/24 16:16:33
android_状态机
1 MediaPlayer State2 MediaCodec State3 ACodec State3.1 ACodec状态机转换实例下面将介绍ACodec从无状态到UninitializedState状态的的转换流程。ACodec::ACodec() ... { mUninitializedState new UninitializedState(this); mLoadedState new LoadedState(this); mLoadedToIdleState new LoadedToIdleState(this); mIdleToExecutingState new IdleToExecutingState(this); mExecutingState new ExecutingState(this); mOutputPortSettingsChangedState new OutputPortSettingsChangedState(this); mExecutingToIdleState new ExecutingToIdleState(this); mIdleToLoadedState new IdleToLoadedState(this); mFlushingState new FlushingState(this); ... // 实际调用父类AHierarchicalStateMachine中的changeState函数。 changeState(mUninitializedState); } ###################################################################### void AHierarchicalStateMachine::changeState(const spAState state) { // 此时state UninitializedStatemState NULL。 if (state mState) { // Quick exit for the easy case. return; } VectorspAState A; spAState cur mState; for (;;) { A.push(cur); // 此时cur为NULL直接跳出循环。 if (cur NULL) { break; } cur cur-parentState(); } VectorspAState B; cur state; for (;;) { B.push(cur); if (cur NULL) { break; } // cur-parentState为NULL详细分析见下面 // UninitializedState::UninitializedState构造函数。 cur cur-parentState(); } // Remove the common tail. // 移除容器中结尾的指针为NULL的元素移动后A,B容器只剩有效的状态。 while (A.size() 0 B.size() 0 A.top() B.top()) { A.pop(); B.pop(); } // 将UninitializedState赋值给mState变量。 mState state; // 此时A.size()为0直接跳过循环。 for (size_t i 0; i A.size(); i) { A.editItemAt(i)-stateExited(); } // 此时B.size()为1进入循环。 for (size_t i B.size(); i 0;) { i--; // 调用ACodec::UninitializedState::stateEntered函数。 B.editItemAt(i)-stateEntered(); } } ###################################################################### ACodec::UninitializedState::UninitializedState(ACodec *codec) : BaseState(codec) { } struct ACodec::BaseState : public AState { explicit BaseState(ACodec *codec, const spAState parentState NULL); ... } ACodec::BaseState::BaseState(ACodec *codec, const spAState parentState) : AState(parentState), // 由BaseState构造函数默认值可以得到parentState为NULL。 mCodec(codec), mPendingExtraOutputMetadataBufferRequest(false) { } AState::AState(const spAState parentState) : mParentState(parentState) { // 根据上述构造函数中的形参可以得到mParentState为NULL。 }