本文已經收錄到個人
Github
我的博客,歡迎大佬們光臨寒舍:html個人GIthub博客git
Activity
的工做過程Service
的工做過程
Service
的啓動過程Service
的綁定過程
BroadcastReceiver
的工做過程
BroadcastReceiver
的註冊過程BroadcastReceiver
的發送和接收過程
ContentProvider
的工做過程何爲「四大」:github
Activity
Service
BroadcastReceiver
ContentProvider
談到四大組件,相信在座各位都再熟悉不過了,光聞其名,未見其聲,「四大」二字一出,足見其在安卓系統中的地位,可謂是安卓界的F4
。面試
其地位之崇高,在某種程度上也能夠體現他的重要性,因此說,光會使用四大組件仍是不能體現咱們對他的重視(ai hu)的,咱們還要分析其工做過程,可以更好地理解系統內部的運行機制,從而加深對Android
體系結構的認識;同時,四大組件仍是面試必問的知識點之一。數據庫
綜上,掌握好四大組件相關的知識,對於一個Android
開發者來講是很是重要的!ide
如下內容緊張赤雞,請繫好保險帶,咱們要開車(hu you)了。— No picture,say a J8!post
Activity
類型:展現型組件學習
做用:展現一個界面並和用戶交互測試
使用:this
A.須要在AndroidManifest
中註冊
B.須要藉助Intent
啓動,兩種方式:
顯示
Intent
:
Intent intent=new Intent(xxx.this,xxx.class); startActivity(intent);
隱式
Intent
:
Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);
standard
:標準模式singleTop
:棧頂複用模式singleTask
:棧內複用模式singleInstance
:單實例模式想了解啓動模式的讀者,能夠看下筆者寫的一篇文章:進階之路 | 奇妙的Activity之旅中的
2.2
部分
finish()
結束一個Activity
Service
類型:計算型組件
做用:在後臺執行一系列計算任務,耗時的後臺計算建議在單獨的線程中執行
使用:
A.須要在AndroidManifest
中註冊
B.須要藉助Intent
啓動:Intent intent = new Intent(xxx.this, xxx.class); startService(intent);
C.兩種運行狀態:
- 啓動狀態:經過
startService()
- 綁定狀態:經過
bindService()
D.中止方式:unBindService();stopService();
BroadcastReceiver
兩種註冊方式:
A.動態註冊:經過
Context.registerReceiver()
&Context.unRegisterReceiver()
,必需要啓動應用才能註冊並接收廣播。B.靜態註冊:在
AndroidManifest
文件中註冊,不須要啓動應用便可接收廣播。須要藉助
Intent
發送廣播:Intent intent = new Intent("xxx"); sendBroadcast(intent);
四種廣播類型:
A.普通廣播
B.有序廣播
C.本地廣播
D.粘性廣播
ContentProvider
IPC
的一種方式)
須要在
AndroidManifest
中註冊無需藉助
Intent
啓動四種操做:注意須要處理好線程同步(由於這些操做運行在
Binder
線程)A.
insert()
:添加數據B.
update()
:更新數據C.
delete()
:刪除數據D.
query()
:查詢數據
想詳細瞭解
IPC
機制的讀者,能夠看下筆者寫的一篇文章:進階之路 | 奇妙的 IPC 之旅
差很少該進入今天的主題了,爲了逼格,爲了高薪,大夥往前衝!
Activity
Activity
啓動過程流程圖:
一眼看上去有點暈暈的,牆裂建議配合源碼一塊兒服用,效果極佳,筆者推薦一篇文章:圖解Activity啓動流程,進階高級
Q1:結論:
ActivityManagerService
、ApplicationThread
都是Binder
Application
的建立也是經過Instrumentation
來完成的,這個過程和Activity
對象同樣,都是經過類加載器來實現的Activity
的啓動過程最終回到ApplicationThread
中,經過ApplicationThread.scheduleLaunchActivity()
將啓動Activity
的消息發送並交由Handler H
處理。Handler H
對消息的處理會調用handleLaunchActivity()
->performLaunchActivity()
得以最終完成Activity的建立和啓動。Q2:重點類:
Instrumentation
:
instrumentation
是Android
系統裏面的一套控制方法或者」鉤子「。 這些鉤子能夠在正常的生命週期(正常是由操做系統控制的)以外控制Android
控件的運行;它們同時能夠控制Android
如何加載應用程序。
ActivityManagerService「AMS」
:
AMS
是系統的引導服務,應用進程的啓動、切換和調度、四大組件的啓動和管理都須要AMS
的支持。
ActivityStackSupervisor
:
ActivityStackSupervisor
在AMS
中的構造方法中被建立。
AMS
經過操做ActivityStackSupervisor
來管理Activity
ActivityStack
:
ActivityStack
從名稱來看是跟棧相關的類,其實它是一個管理類,用來管理系統全部Activity
的各類狀態- 它由
ActivityStackSupervisor
來進行管理的
ApplicationThread
:
ActivityThread
的私有內部類,也是一個Binder
對象- 在此處它是做爲
IApplicationThread
對象的Server
端,等待Client
端的請求而後進行處理,最大的Client
就是AMS
Service
源碼流程分析:Service的工做過程
結論:
ContextImpl
是Context
的具體實現,經過Activity.attach()
和Activity
創建關聯。Activity.attach()
中還會完成Window
的建立並和Activity&Window
的關聯,由此事件可傳遞給Window
。ActivityServices
是一個輔助ActivityManagerService
(AMS)進行Service
管理的類,包括Service
的啓動、綁定和中止。Activity
相似的,Service
的啓動/綁定過程最終回到ApplicationThread
中,經過ActivityThread.handleCreateService()
/ActivityThread.handleBindService
完成Service的啓動/綁定,注意綁定Service的後續還必須告知客戶端已經成功鏈接Service
的這一流程,由ActivityManagerService.publishService()
去完成。BroadcastReceiver
源碼流程分析:BroadcastReceiver 的工做過程分析
四大組件的靜態註冊都是在應用安裝時由
PackageManagerService(PMS)
解析註冊,當動態註冊BroadcastReceiver
時流程爲:
結論:
AMS
,並把遠程Receiver
( 實際上傳的是IIntentReceiver
,是個Binder
對象)和遠程IntentFilter
保存起來,完成註冊任務
FLAG_EXCLUDE_STOPPED_PACKAGES
:廣播不會發送給已經中止的APP
(系統爲全部廣播默認添加該標記)FLAG_INCLUDE_STOPPED_PACKAGES
:廣播也會發送到已經中止的APP
(兩個標記共存時,以該標記爲準)
ReceiverDispatcher .performReceive ()
裏回調了Receiver
的onReceive()
,使得廣播得以接收並處理Q2:實現原理:
從實現原理看上,廣播使用了觀察者模式,基於消息的發佈/訂閱事件模型
具體實現流程要點粗略歸納以下:
BroadcastReceiver
經過Binder
機制向AMS
進行註冊Binder
機制向AMS
發送廣播AMS
查找符合相應條件(IntentFilter
/Permission
等)的BroadcastReceiver
,將廣播發送到BroadcastReceiver
(通常狀況下是Activity
)相應的消息循環隊列中BroadcastReceiver
中的onReceive()
方法ContentProvider
ActivityThread.main()
:建立ActivityThread
實例並建立主線程消息隊列ActivityThread.attach()
:遠程調用AMS.attachApplication()
並提供ApplicationThread
用於和AMS
的通訊AMS.attachApplication()
:經過ActivityThread.bindApplication()
方法和Handler H
來調回ActivityThread.handleBindApplication()
ActivityThread.handleBindApplication()
:先建立Application
、再加載ContentProvider
、最後回調Application.onCreate()
Query
過程流程
insert()
、delete()
和update()
的實現原理和query()
相似,限於篇幅,這裏不展開,感興趣的讀者能夠主動去探究源碼流程分析:ContentProvider的工做過程
結論:
ContentProvider
的multiprocess
屬性:ContentProvider
是不是單例,通常用單例
訪問ContentProvider
須要ContentResolver
,其真正實現類是ApplicationContentResolver
。當ContentProvider
所在進程未啓動時,第一次訪問它會觸發ContentProvider
的建立以及進程啓動
當ContentProvider
所在的進程啓動時,會同時被啓動並被髮布到AMS
中
注意:
ContentProvider.onCreate()
要先於Application.onCreate()
執行
ActivityThread.handleBindApplication()
完成ContentProvider
的建立。恭喜你!已經看完了前面的文章,相信你對
四大組件
已經有必定深度的瞭解,下面,進行一下課堂小測試,驗證一下本身的學習成果吧!
Q1:爲何要使用ContentProvider
?它和SQL
在實現上有什麼區別?
ContentProvider
屏蔽了數據存儲的細節,內部實現透明化,用戶只需關心URI
便可(是否匹配)ContentProvider
能實現不一樣APP
的數據共享,SQL
只能是本身程序才能訪問ContentProvider
還能增刪本地的文件,XML
等信息Q2:Android
引入四大組件的用意
這個問題在筆者剛開始學習
Android
的時候就一直困惑,直到看了一篇Google Android 團隊:Dianne Hackborn發表在Google+
上的一篇post
的譯文
看法:Google Android Framework
團隊決定,不要讓一個明確的Main
方法做爲APP
的入口,由於須要讓系統對APP
怎樣運行有更多的控制權,在該系統中,用戶永遠不須要考慮開啓和中止一個APP
,而把這些事交給系統去管理。因此他們設計了四大組件以做爲APP
功能的載體和入口:
Activity
一個
APP
與用戶交互的入口
BroadcastReceiver
- 一種讓系統在正常的用戶流(
user flow
)以外,傳遞事件給APP
的機制。- 最重要的是,由於這是另外一個被精心定義的
APP
的入口,即便APP
當前並不在運行,系統也能夠將Broadcasts
傳遞給APP
。
Service
當
APP
因爲各類各樣的緣由須要在後臺運行時,Service
就是一個這樣的入口
ContentProvider
- 人們一般會將它看成對數據庫的抽象,由於有許多的
API
和支持庫就是這樣使用ContentProvider
的- 可是從系統設計的角度,這並非
ContentProvider
的初衷。對於系統來講,ContentProvider
其實是一個入口,用於獲取一個APP
內部的公開的被命名的數據項(data items
),每一個數據項都被一個URI scheme
所標識。
若是文章對您有一點幫助的話,但願您能點一下贊,您的點贊,是我前進的動力
本文參考連接: