接着Android startActivity流程剖析(一) Android 10 [API 29] 中的Activity#attach完结后。
startActivity还包括onCreate、onStart、onResume,逐一剖析。
onC初始化sdk什么意思reate()
Activity#onCreate中主要是进行Create事情的回调,包括Fragmen线程和进程的区别是什么tManager初始化磁盘及ActivityL线程池的七个参数ifecycleCallbacks
protected void onCreate(@Nullable Bundle savedInstanceState) { .... mFragments.dispatchCreate(); dispatchActivityCreated(savedInstanceState); ... mCalled = true; }
Activity#setContentViewindows7旗舰版w
public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }
这儿getapproveWindow()回approve来的是PhoneWindow目标,进入PhoneWindow的setContentView其间主要为以下2项
- installDecor(),初始化DecorVie公司让员工下班发手机电量截图w,同时mContentParent也被赋值
- mLayoutInfl线程的几种状态ater.inflate(layoutResID, mContentParent);构建View
注:使用appcompat下的AppCompatActivitwindows系统y后流程会有差异,但全体逻辑不同不大
PhoneWindow.java public void setContentView(int layoutResID) { if (mContentParent == null) { installDecor(); } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) { mContentParent.removeAllViews(); } .... mLayoutInflater.inflate(layoutResID, mContentParent); .... mContentParent.requestApplyInsets(); // Activity#attach时,mWindow.setCallback(this),所以此处调用的为Activity#onContentChanged final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } mContentParentExplicitlySet = true; }
PhoneWinwindows是什么意思dow#ingooglestallDecor
构建了DecorView,并初始化mContentParent,mContentParent的id为ID_ANDROID_CONTENT
ViewGroup cont初始化电脑时出现问题entParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
查看是否有title,有的话是否要躲藏。
private void installDecor() { mForceDecorInstall = false; if (mDecor == null) { mDecor = generateDecor(-1); mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); mDecor.setIsRootNamespace(true); if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) { mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } else { mDecor.setWindow(this); } if (mContentParent == null) { mContentParent = generateLayout(mDecor); // Set up decor part of UI to ignore fitsSystemWindows if appropriate. mDecor.makeOptionalFitsSystemWindows(); .... //初始化title mTitleView = findViewById(R.id.title); if (mTitleView != null) { // 查看mLocalFeatures的第FEATURE_NO_TITLE位是否为1,为0的话躲藏titleContainer if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) { final View titleContainer = findViewById(R.id.title_container); if (titleContainer != null) { titleContainer.setVisibility(View.GONE); } else { mTitleView.setVisibility(View.GONE); } mContentParent.setForeground(null); } else { mTitleView.setText(mTitle); } } } .... } }
L初始化磁盘ayout线程数是什么Inflater.inflate线程是什么意思()
mLayoutInflater.inflate(layoutResID, mCont工资超过5000怎么扣税entParent); 这儿用到了两个参数的重载,即Inflate指定的layout线程撕裂者并增加到mConten初始化磁盘tParent中。
onStart()
第二步:performLifecycleSequence,其间计算start、finish之间的状态,并调用ActivityThread的handleStartActivity
TransactionExecutor.java private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState, ClientTransaction transaction) { final int start = r.getLifecycleState(); .... //这儿start为1:ON_CREATE,finish为3:ON_RESUME计算后path中包括2:ON_START final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState); performLifecycleSequence(r, path, transaction); } private void performLifecycleSequence(ActivityClientRecord r, IntArray path, ClientTransaction transaction) { final int size = path.size(); for (int i = 0, state; i < size; i++) { state = path.get(i); ...... switch (state) { case ON_CREATE: mTransactionHandler.handleLaunchActivity(r, mPendingActions, null /* customIntent */); break; case ON_START: //调用ActivityThread的handleStartActivity mTransactionHandler.handleStartActivity(r, mPendingActions); break; case ON_RESUME: mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */, r.isForward, "LIFECYCLER_RESUME_ACTIVITY"); break; ....... }
Ac初始化英文tivityThread#handleStartActiwindows许可证即将过期怎么办vity中开始Act初始化电脑的后果ivity的start
ActivityThread.java public void handleStartActivity(ActivityClientRecord r, PendingTransactionActions pendingActions) { final Activity activity = r.activity; ..... // Start activity.performStart("handleStartActivity"); r.setState(ON_START); ..... }
后续履行Activity#performStart并经过Instrumentation调用activity的onStart完结start流程。
onResume()
在TransactionExecutor的第三步,也便是lifecycleItem.execute,即履行ResumeActiv宫颈癌ityIte线程池面试题m的execute。进入了ActivityThread的handleResumeActivity
public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume"); client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward, "RESUME_ACTIVITY"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); }
handleResumeActivity线程池中
1.调用了Activity的performResume经过Instr宫颈癌umentation#callActivityOnResume回调Activity的onResume。并更新ActivityClientRecord的state为ON_RESUME
2.将Window中的DecorView赋值给Acti初始化游戏启动器失败vity的成员变量mDecor,经过WindowManagerGlobal#addView将DecorView加入到WMS中。
ActivityThread.java public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { .... // TODO Push resumeArgs into the activity for consideration final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); ...... final Activity a = r.activity; ...... if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); decor.setVisibility(View.INVISIBLE); ViewManager wm = a.getWindowManager(); WindowManager.LayoutParams l = r.window.getAttributes(); a.mDecor = decor; ...... if (a.mVisibleFromClient) { if (!a.mWindowAdded) { a.mWindowAdded = true; wm.addView(decor, l); } else { ..... } ..... }
WindowManagerappetiteImpl#addView流程
其间较为重要的有Go三点:
-
创立ViewRootImpl
其间有个细节是会对成员变量mThreadwindows更新有必要吗赋值为当前线程,也便是主线程,后续其间的方法调用大多都会调用checkThread查appearance看从哪个线程来的,若不是主线程则会抛出反常。
ViewRootImpl.java public ViewRootImpl(Context context, Display display) { mThread = Thread.currentThread(); } void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only the original thread that created a view hierarchy can touch its views."); } }
-
构建DecorView、ViewRootImpl、WindowManager初始化是什么意思.LayoutParams的对应关系
-
增加到WMS并显现
ViewManager目标wm是经过a.getWindowManager()得到的,其初始化参阅attach流程。wm.addView(decor, l);调用的为
WindowManagerImpl#addView() -&g线程撕裂者t; WindowManagerGloba初始化sdk什么意思l.addView()
WindowManagerGwindows系统lobal是App侧的单例,其间mViews、mRoots、mParams分别保存着App内的一切DecorView及与之对应的ViewRootImp线程池的七个参数l、WindowMan工商银行ager.LayoutParams。
WindowManagerGlobal.java public void addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow) { ...... ViewRootImpl root; View panelParentView = null; synchronized (mLock) { .... root = new ViewRootImpl(view.getContext(), display); view.setLayoutParams(wparams); mViews.add(view); mRoots.add(root); mParams.add(wparams); // do this last because it fires off messages to start doing things try { root.setView(view, wparams, panelParentView); ....... } }
增加完后进入ViewRootImpl#setView
ViewRootImpl.java public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { synchronized (this) { if (mView == null) { mView = view; ..... // Schedule the first layout -before- adding to the window // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); .... res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, getHostVisibility(), mDisplay.getDisplayId(), mTmpFrame, mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel, mTempInsets); setFrame(mTmpFrame); ..... } }
其间主要做了两件事
-
requestLayout()
查appstore看线程,标记状态后进入scheduleTraversals()
public void requestLayout() { if (!mHandlingLayoutInLayoutRequest) { checkThread(); mLayoutRequested = true; scheduleTraversals(); } }
scheduleTraversals()
- 增加同步屏障
- mChoreograpproveapher.postCallback,将mTraversalRunnable加入到Choreograph宫颈癌er类的mCallbackQueues中
void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalScheduled = true; mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier(); mChoreographer.postCallback( Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); ....... } }
下一个VSync脉冲到来回调FrameDisplayEventReceiver#onVsync后进入Cwindows11有必要升级吗horeographer的doFrame,在其间调用doCallbacks履行一线程数是什么切类型为Choreographer.CALLBACK_TRAVERSAL的callback,即ViewRootImpl中的TraversalRunnable
void doFrame(long frameTimeNanos, int frame) { ..... try { ..... mFrameInfo.markPerformTraversalsStart(); doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); } finally { AnimationUtils.unlockAnimationClock(); Trace.traceEnd(Trace.TRACE_TAG_VIEW); } .... }
ViewRoo公积金tImpl.TraversalRunnaapproachble
final class TraversalRunnable implements Runnable { @Override public void run() { doTraversal(); } }
ViewRootImpl#doTraversal()
其间包括两步
1.removeSyn工商银行cBarriappearer铲除内存屏障让一切消息都得以履行
2.performTraversals
void doTraversal() { if (mTraversalScheduled) { mTraversalScheduled = false; mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); ...... performTraversals(); ...... } }
ViewRootImpl#perform工龄越长退休金越多吗Traversals
perapproveformTraversals中包括了对View及其子View的Measure、Layout、Draw操作,View完结展现。
private void performTraversals() { ..... performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); .... performLayout(lp, mWidth, mHeight); ..... performDraw(); ..... mIsInTraversal = false; }
-
mWindowSession.addToDisplay 这儿的mWindowSession是经过WindowManagerGlobal.getWindowSession()赋值的,其实现为server下的Session类
public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets, Rect outStableInsets, Rect outOutsets, DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, InsetsState outInsetsState) { return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame, outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel, outInsetsState); }
最终调用的是WMS的addWin初始化英文dow进行增加
总结
onCreate过程中创立了DecorView并解析传入的布局文件增加到DecorView。
o初始化nStarAPPt回调在Activity对用户可见时,前后台切换场景的逻辑较多在此处理。
onResume中包括
- 将Activity中的mDecor与Window中decor关联
- WindowManagerGlobal中建立ViewRootImpl、DecorView、WindowManager.LayoutParams的关联
- 调用ViewRootImpl#segoogletView,将ViewRootImpl包装线程为IWindow增加到WMS中,并调用requestLayout显现UI
评论(0)