一、activity跨進(jìn)程啟動(dòng)
- 點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向system_server進(jìn)程發(fā)起startActivity請(qǐng)求
- system_server進(jìn)程接收到請(qǐng)求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求;
Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程 - App進(jìn)程,通過(guò)Binder IPC向sytem_server進(jìn)程發(fā)起attachApplication請(qǐng)求;
- system_server進(jìn)程在收到請(qǐng)求后,進(jìn)行一系列準(zhǔn)備工作后,再通過(guò)binder IPC向App進(jìn) 程發(fā)送scheduleLaunchActivity請(qǐng)求
- App進(jìn)程的binder線程(ApplicationThread)在收到請(qǐng)求后,通過(guò)handler向主線程發(fā)送LAUNCH_ACTIVITY消息
- 主線程在收到Message后,通過(guò)發(fā)射機(jī)制創(chuàng)建目標(biāo)Activity,并回調(diào)Activity.onCreate()等方法
二、activity進(jìn)程內(nèi)啟動(dòng)
1.相關(guān)類(lèi)
- ActivityThread:main()函數(shù),相當(dāng)于一個(gè)Handler,主線程,UI線程
- ApplicationThread:與AMS溝通橋梁
- mInstrumentation:通過(guò)這個(gè)api啟動(dòng)app,用來(lái)跟蹤Activity和Application生命周期的類(lèi)
- AMS:數(shù)據(jù)管理者
2.啟動(dòng)流程
請(qǐng)求進(jìn)程A:startActivity—(hook插入點(diǎn)1) (AMP,ActivityManager代理對(duì)象)——> system_server進(jìn)程:AMS(ActivityManagerService)解析Activity信息、處理啟動(dòng)參數(shù)、scheduleLaunchActivity/mH中EXECUTE_TRANSACTION消息處理(Android P)–>回到請(qǐng)求進(jìn)程A:ApplicationThread --> ActivityThread -(hook插入點(diǎn)2)-> Activity生命周期
簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是通過(guò)AMS代理類(lèi),封裝創(chuàng)建Activity的信息,然后回調(diào)給ActivityThread,通過(guò)mInstrumentation創(chuàng)建Activity,調(diào)用onCreate方法啟動(dòng)Activity
三、顯式啟動(dòng)和隱式啟動(dòng)
1.顯式啟動(dòng)
1、構(gòu)造方法傳入Component,最常用的方式
2、setComponent(componentName)方法
3、setClass/setClassName方法文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-493958.html
2.隱式啟動(dòng)
隱式Intent是通過(guò)在AndroidManifest文件中設(shè)置action、data、category,讓系統(tǒng)來(lái)篩選出合適的Activity文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493958.html
<activity
android:name="com.juexiao.fakao.ui.activity.WelcomeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.jrmf360.action.ENTER"/>
<category android:name="android.intent.category.DEFAULT"/>
<data
android:host="jrmf360.com"
android:port="8888"
android:scheme="jrmf"/>
</intent-filter>
</activity>
action匹配規(guī)則
- Intent-filter action可以設(shè)置多條
- intent中的action只要與intent-filter其中的一條匹配成功即可,且intent中action最多只有一條
- Intent-filter內(nèi)必須至少包含一個(gè)action
category匹配規(guī)則
- Intent-filter內(nèi)必須至少包含一個(gè)category,android:name為
android.intent.category.DEFAULT
- intent-filter中,category可以有多條
- intent中,category也可以有多條
- intent中所有的category都可以在intent-filter中找到一樣的(包括大小寫(xiě))才算匹配成功
data匹配規(guī)則
- intent-filter中可以設(shè)置多個(gè)data
- intent中只能設(shè)置一個(gè)data
- intent-filter中指定了data,intent中就要指定其中的一個(gè)data
到了這里,關(guān)于Activity啟動(dòng)流程分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!