startService源碼從應(yīng)用主進(jìn)程到AMS進(jìn)程的過程分析及涉及裝飾晒来、代理、單利設(shè)計(jì)模式

從三個(gè)流程上來分析:

一郑现、從activity的startService到ContextImpl的大概流程湃崩,涉及到裝飾模式:

在Activity類中實(shí)現(xiàn)startService(),

從類圖關(guān)系中,Activity繼承了ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper類接箫,所以startService在ContextWrapper類startService函數(shù)攒读,我們看下ContextWrapper中startService函數(shù):

ContextWrapper類:


有一個(gè)成員變量mBase,它是一個(gè)ContextImpl實(shí)例辛友,最終startService走到ContextImpl類中:


這幾個(gè)類設(shè)計(jì)是典型的裝飾模式(Decorator)薄扁,ContextWrapper的startService函數(shù)調(diào)用ContextImpl的startService額外職責(zé)后,可以繼續(xù)做自己的事情废累。

我們接下來看這個(gè)mBase是什么時(shí)候生成的邓梅。

在啟動(dòng)activity時(shí)Activity.startActivity-->Activity.startActivityForResult-->Instrumentation.execStartActivity-->ActivityManagerNative.getDefault(ActivityManagerProxy).startActivity-->ActivityManagerService.startActivity-->ActivityStack.startActivityMayWait-->ActivityStack.startActivityLocked…..-->這中間一系列的上一個(gè)activity的on Pause操作-->ActivityStack.realStartActivityLocked-->ApplicationThreadProxy.scheduleLaunchActivity-->ApplicationThread.scheduleLaunchActivity-->H.handleMessage-->ActivityThread.handleLaunchActivity-->ActivityThread.performLaunchActivity.

ActivityThreadperformLaunchActivity函數(shù)創(chuàng)建activity以及ContextImpl的初始:

看下這源碼:


紅框是創(chuàng)建activity,繼續(xù)看


CreateBaseContextForActivity創(chuàng)建ContextImpl邑滨,并把a(bǔ)ctivity設(shè)置為outerContext的:


接著實(shí)行activity類中的attach函數(shù)日缨,這個(gè)attach會(huì)關(guān)聯(lián)Ativity、Window(phoneWindow)驼修、WindowManager:


通過attachBaseContext(context)把ContextImpl設(shè)置到父類ContextWrapper的mBase殿遂。

二、從ContextImpl的startService到ActivityManagerProxy的大概流程,涉及代理乙各、單利模式


我們抽離看ContextImpl的startService開始:

ContextImpl類:



我們接著看ActivityManageNative類中的getDefault:



這AcivityManagerNative墨礁、ActivityManagerProxy就是典型的代理模式,AcivityManagerNative把一些工作委托給ActivityManagerProxy來做耳峦。

這里面gDefault.get()是一個(gè)單例的助手類延遲初始化恩静。我們看下Singleton的設(shè)計(jì):


三:我們看下ActivityManagerProxy的startService與system_server的ActivityManagerService是如何調(diào)用:

來看下ActivityManagerProxy類中的startService:


其中mRemote是IBinder,就是ActivityManagerService的蹲坷,通過Binder驅(qū)動(dòng)走到system_server的ActivityManagerService的onTransact函數(shù)驶乾,

ActivityManagerService的onTransact:


調(diào)用到父類的ActivityManagerNative的onTransact():



startService的標(biāo)示是START_SERVICE_TRANSACTION,之后就走到了ActivityManagerService的startService函數(shù):


就開始走到ActiveServices mServices的startServiceLocked,先分析到這個(gè)循签,我們看下底下這張調(diào)用流程圖:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末级乐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子县匠,更是在濱河造成了極大的恐慌风科,老刑警劉巖撒轮,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贼穆,居然都是意外死亡题山,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門故痊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顶瞳,“玉大人,你說我怎么就攤上這事愕秫】猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵豫领,是天一觀的道長抡柿。 經(jīng)常有香客問我舔琅,道長等恐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任备蚓,我火速辦了婚禮课蔬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郊尝。我一直安慰自己二跋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布流昏。 她就那樣靜靜地躺著扎即,像睡著了一般。 火紅的嫁衣襯著肌膚如雪况凉。 梳的紋絲不亂的頭發(fā)上谚鄙,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音刁绒,去河邊找鬼闷营。 笑死,一個(gè)胖子當(dāng)著我的面吹牛知市,可吹牛的內(nèi)容都是我干的傻盟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫂丙,長吁一口氣:“原來是場噩夢啊……” “哼娘赴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跟啤,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤诽表,失蹤者是張志新(化名)和其女友劉穎媳叨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关顷,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糊秆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了议双。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘番。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖平痰,靈堂內(nèi)的尸體忽然破棺而出汞舱,到底是詐尸還是另有隱情,我是刑警寧澤宗雇,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布昂芜,位于F島的核電站,受9級特大地震影響赔蒲,放射性物質(zhì)發(fā)生泄漏泌神。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一舞虱、第九天 我趴在偏房一處隱蔽的房頂上張望欢际。 院中可真熱鬧,春花似錦矾兜、人聲如沸损趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浑槽。三九已至,卻和暖如春返帕,著一層夾襖步出監(jiān)牢的瞬間桐玻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工溉旋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畸冲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓观腊,卻偏偏與公主長得像邑闲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子梧油,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容