本文側(cè)重講解android N 系統(tǒng)中四大組件的工作原理,不同系統(tǒng)原理略有差別葫哗。通過分析四大組件的工作流程加深對(duì)Android Framework的理解缔刹,也為插件化開發(fā)打下基礎(chǔ)。
四大組件的工作狀態(tài)
Activity
展示一個(gè)界面并和用戶交互劣针,它扮演的是一個(gè)前臺(tái)界面的角色校镐。
Service
計(jì)算型組件,用于后臺(tái)執(zhí)行一系列計(jì)算任務(wù)捺典,工作在主線程鸟廓,耗時(shí)操作需要另起線程, 分為啟動(dòng)狀態(tài)和綁定狀態(tài)襟己。
BroadcastReceiver
消息型組件肝箱,主要用于不同組件或者不同應(yīng)用之間的消息傳遞,它工作在系統(tǒng)內(nèi)部稀蟋,不適合執(zhí)行耗時(shí)操作煌张,操作超過5s,會(huì)出現(xiàn)ANR退客。
ContentProvider
數(shù)據(jù)共享型組件骏融,用于向其他組件或者應(yīng)用共享數(shù)據(jù),主要執(zhí)行CURD操作萌狂。
Activity工作原理
我們啟動(dòng)一個(gè)activity有兩種方法档玻,
第一種(Activity直接啟動(dòng)方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
第二種(Context啟動(dòng)方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);
不同的啟動(dòng)方式Activity的工作流程有點(diǎn)差別。
兩種啟動(dòng)都會(huì)調(diào)用到Instrumentation類中的execStartActivity的方法茫藏,系統(tǒng)最終是通過ActivityThread中的performLaunchActivity完成Activity的創(chuàng)建和啟動(dòng)误趴。
performLaunchActivity方法主要完成以下工作:
1、通過ActivityClientRecord對(duì)象獲取啟動(dòng)activity的組件信息
2务傲、通過mInstrumentation對(duì)象的newActivity方法調(diào)用classloader完成activity的創(chuàng)建
3凉当、通過r.packageInfo(LoadedApk 對(duì)象)的makeApplication方法嘗試創(chuàng)建Application對(duì)象
4、創(chuàng)建ContextImpl對(duì)象并調(diào)用Activity的attach方法完成一些數(shù)據(jù)的初始化
5售葡、調(diào)用Activity的onCreate方法
在Activity啟動(dòng)的過程中看杭,App進(jìn)程會(huì)頻繁地與AMS進(jìn)程進(jìn)行通信:
App進(jìn)程會(huì)委托AMS進(jìn)程完成Activity生命周期的管理以及任務(wù)棧的管理;這個(gè)通信過程AMS是Server端挟伙,App進(jìn)程通過持有AMS的client代理IActivityManager完成通信過程楼雹;
AMS進(jìn)程完成生命周期管理以及任務(wù)棧管理后,會(huì)把控制權(quán)交給App進(jìn)程,讓App進(jìn)程完成Activity類對(duì)象的創(chuàng)建贮缅,以及生命周期回調(diào)榨咐;這個(gè)通信過程也是通過Binder完成的,App所在server端的Binder對(duì)象存在于ActivityThread的內(nèi)部類ApplicationThread谴供;AMS所在client通過持有IApplicationThread的代理對(duì)象完成對(duì)于App進(jìn)程的通信块茁。
Service工作原理
Service有兩種啟動(dòng)方式,startService()和bindService()憔鬼,兩種狀態(tài)可以并存:
startService流程
bindService流程
BroadcastReceiver工作原理
BroadcastReceiver的工作過程主要包括廣播的注冊(cè)龟劲、發(fā)送和接收:
動(dòng)態(tài)注冊(cè)過程:
發(fā)送過程
靜態(tài)注冊(cè)是由PackageManagerService(PMS)在應(yīng)用安裝的時(shí)候完成整個(gè)注冊(cè)過程的胃夏,除廣播以外轴或,其他三大組件也都是在應(yīng)用安裝時(shí)由PMS解析并注冊(cè)的。
ContentProvider工作原理
每個(gè)進(jìn)程的入口都是ActivityThead.main()仰禀,App的啟動(dòng)流程如下:
從源碼中可以看出:
應(yīng)用啟動(dòng)的入口為ActivityThread的main方法照雁,main方法會(huì)創(chuàng)建ActivityThread實(shí)例并創(chuàng)建主線程消息隊(duì)列。
attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法答恶,并提供ApplicationThread用于和AMS的通信饺蚊。
attachApplication方法會(huì)通過bindApplication方法和H來調(diào)回ActivityThread的handleBindApplication,這個(gè)方法會(huì)先創(chuàng)建Application悬嗓,再加載ContentProvider污呼,然后才會(huì)回調(diào)Application的onCreate方法。
由上圖可以看出包竹,在ContentProvider的啟動(dòng)過程中伴隨著app進(jìn)程的啟動(dòng)燕酷。
ContentProvider的其他CURD操作如insert,delete周瞎,update跟query的流程類似苗缩。