考察要點:
1. 程序A與AMS的互動過程此處以跨程序啟動Activity分析一下原始碼流程:
startProcessLocked方法首先呼叫Process.start("android.app.ActivityThread",)方法會向Zygote傳送一個啟動程序的請求,並告知Zygote程序啟動之後,載入ActivityThread這個類的入口main函式,啟動完成後返回程序的pid,並向AMS的Handler傳送一個延遲訊息,為的是要求目標程序啟動後,10秒鐘內需要向AMS報告,不然的話AMS就會清除目標程序的相關資訊。Process.start方法會去呼叫startViaZygote(processClass,)函式,這個函式主要做了兩件事,一件就是開啟通往Zygote的Socket,第二件事就是通過Socket傳送啟動程序引數。Zygote端主要邏輯是在runOnce函式,函式內呼叫Zygote.forkAndSpecialize(...)建立子程序,建立完成之後就分別在父程序和子程序裡面做各自的事情1) 父程序通過hanleParentProc(pid)把子程序的pid通過Socket傳送給AMS2)子程序呼叫handleChildProc函式,做一些通用的初始化,比如啟用Binder機制;執行應用程式的入口函式,也就是ActivityThread的Main函式
ActivityThread的main函式,裡面會建立一個ActivityThread物件,並呼叫thread.attach(false),為的是向AMS報到,上面第一條裡面有提到。attach方法裡面,其實是一個跨程序的呼叫,首先通過IActivityManager mgr = ActivityManagerNative.getDefault();
獲取到AMS的Binder代理物件,然後呼叫
mgr.attachApplication(mAppThread);
mAppThread是應用端的一個Binder物件ApplicationThread,也就是最上面一張圖的ATP,這樣AMS端就可以呼叫應用端了。
attachApplication方法裡面,最主要有兩個方法,一個是通過傳入的ApplicationThread物件,呼叫bindApplication初始化Application物件,另一個就是通過mStactSupervisor.attachApplicationLoacked(app);
初始化掛起的Activity物件。
在attachApplicationLoacked函式裡,會呼叫ActivityRecord hr = stack.topRunningActivityLocked(null);
其中要明白AMS裡面有兩個棧,一個是Launch桌面棧,一個就是非桌面棧mFocusedStack,此處的stack就是mFocusedStack,它會將棧頂的ActivityRecord返回出來,我們的目標Activity早就放置在了棧頂,只是一直沒有初始化。然後呼叫
realStartActivityLocked(hr,app,true,true);
方法,來啟動Activity,如果我們不是啟動另外一個程序,而是同一程序,那麼這第二大部分就不會存在了,而是直接呼叫realStartActivityLocked方法。
3. 應用端Activity啟動的幾個步驟realStartActivityLocked函式會呼叫app.thread.scheduleLaunchActivity(new Intent(r.intent),...);也就是通過之前註冊的Binder物件ATP,呼叫scheduleLaunchActivity函式,在scheduleLaunchActivity函式裡面:ActivityClientRecord r = new ActivityClientRecord();...sendMessage(H.LAUNCH_ACTIVITY,r);
封裝了一個ActivityClientRecord訊息,然後丟到主執行緒的Handler(mH)裡。
在主執行緒裡面final ActivityClientRecord r = (ActivityClientRecord)msg.obj ;r.packageInfo = getPackageInfoNoCheck(...);handleLaunchActivity(r,null);
getPackageInfoNoCheck 函式主要是用來生成一個LoadedApk物件,它用來儲存我們的apk資訊,因為後面我們需要一個ClassLoader去載入Apk裡面的Activity類,所以這裡提前準備好。
handleLaunchActivity裡面分為兩個部分,一個是performLaunchActivity函式,一個是handleResumeActivity函式。1) performLaunchActivity
Activity activity = mInstrumentation.newActivity(...);//返回之前建立好的Application app = r.packageInfo.makeApplication(false,mInstrumentation);//生成ContextImplContext appContext = createBaseContextForActivity(r,activity);//給activity繫結上下文和一些初始化的工作,如createPhoneWindowactivity.attach(appContext,...);mInstrumentation.callActivityOnCreate(activity,r.state); //生命週期的OnCreateactivity.performStart(); //生命週期的OnStartreturn activity
2) handleResumeActivity:
最後-> r.activity.performResume() -> mInstrumentation.callActivityOnResume(this); -> activity.onResume()
最後我想說:有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什麼東西。
還有 高階架構技術進階腦圖、Android開發面試專題資料,高階進階架構資料 幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習。
Android學習PDF+架構視訊+面試文件+原始碼筆記
【Android開發核心知識點筆記】
【Android核心高階技術PDF文件,BAT大廠面試真題解析】
【Android高階架構視訊學習資源】
Android精講視訊領取學習後更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說網際網路寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現在市場上初級程式設計師氾濫,這套教程針對Android開發工程師1-6年的人員、正處於瓶頸期,想要年後突破自己漲薪的,進階Android中高階、架構師對你更是如魚得水,趕快領取吧!
【Android進階學習視訊】、【全套Android面試祕籍PDF】、【Android開發核心知識點筆記】可以 私信我【安卓】免費獲取!
最新評論