四大组件的工作过程
1、四大組件的運(yùn)行狀態(tài)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Android的四大組件中除了BroadcastReceiver以外,其他三種組件都必須在AndroidManifest中注冊(cè),對(duì)于BroadcastReceiver來(lái)說(shuō),既可以在AndroidManifest中注冊(cè)也可以通過代碼來(lái)注冊(cè)。
在調(diào)用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider則無(wú)須借助Intent。
Activity組件的主要作用是展示一個(gè)界面并和用戶交互,扮演的是一種前臺(tái)界面的角色。
在實(shí)際開發(fā)中通過Activity的finish方法來(lái)結(jié)束一個(gè)Activity組件的運(yùn)行。
Activity組件只有一種運(yùn)行模式,即Activity處于啟動(dòng)狀態(tài)。
Service是一種計(jì)算型組件,用于在后臺(tái)執(zhí)行一系列計(jì)算任務(wù)。
Service組件有兩種狀態(tài):啟動(dòng)狀態(tài)和綁定狀態(tài)。
當(dāng)Service處于啟動(dòng)狀態(tài)時(shí),這個(gè)時(shí)候Service內(nèi)部可以做一些后臺(tái)計(jì)算,并且不需要和外界有直接的交互。但是耗時(shí)的后臺(tái)計(jì)算仍然需要在單獨(dú)的線程中去完成。
當(dāng)Service處于綁定狀態(tài)時(shí),這個(gè)時(shí)候Service內(nèi)部同樣可以進(jìn)行后臺(tái)計(jì)算,但是處于這種狀態(tài)時(shí)外界可以很方便地和Service組件進(jìn)行通信。
BroadcastReceiver是一種消息型組件,用于在不同的組件乃至不同的應(yīng)用之間傳遞消息。
靜態(tài)廣播:指在AndroidManifest中注冊(cè)廣播,這種廣播在應(yīng)用安裝時(shí)會(huì)被系統(tǒng)解析,此種形式的廣播不需要應(yīng)用啟動(dòng)就可以收到相應(yīng)的廣播。
動(dòng)態(tài)廣播:需要通過Context.registerReceiver()來(lái)實(shí)現(xiàn),并且不需要的時(shí)候要通過Context.unRegisterReceiver()來(lái)解除廣播。廣播不適合執(zhí)行耗時(shí)操作。BroadcastReceiver組件一般來(lái)說(shuō)不需要停止,也沒有停止的概念。
ContentProvider是一種數(shù)據(jù)共享型組件,用于向其他組件乃至其他應(yīng)用共享數(shù)據(jù)。
2、Activity的工作過程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Activity的啟動(dòng)過程。
Activity的startActivity方法有好幾種重載方式,但它們最終會(huì)調(diào)用startActivityForResult方法。
ApplicationThread是ActivityThread的一個(gè)內(nèi)部類。
啟動(dòng)Activity真正的實(shí)現(xiàn)由ActivityManagerNative.getDefault()的startActivity方法來(lái)實(shí)現(xiàn)。
ActivityManagerService繼承自ActivityManagerNative,而ActivityManagerNative繼承自Binder并實(shí)現(xiàn)了IActivityManager這個(gè)Binder接口,因此AMS是一個(gè)Binder,它是IActivityManager的具體實(shí)現(xiàn)。
performLaunchActivity方法最終完成了Activity對(duì)象的創(chuàng)建和啟動(dòng)過程,并且ActivityThread通過handleResumeActivity方法來(lái)調(diào)用被啟動(dòng)Activity的onResume這一生命周期方法。
?
performLaunchActivity這個(gè)方法主要完成了以下5件事:
a、從ActivityClientRecord中獲取待啟動(dòng)的Activity的組件信息;
b、通過Instrumentation的newActivity方法使用類加載器創(chuàng)建Activity對(duì)象;
c、通過LoadedApk的makeApplication方法來(lái)嘗試創(chuàng)建Application對(duì)象。
d、創(chuàng)建ContextImpl對(duì)象并通過Activity的attach方法來(lái)完成一些重要數(shù)據(jù)的初始化;
e、調(diào)用Activity的onCreate方法。
3、Service的工作過程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
啟動(dòng)狀態(tài):主要用于執(zhí)行后臺(tái)計(jì)算;
綁定狀態(tài):主要用于其他組件和Service的交互。
這兩種狀態(tài)可以共存。
?
通過Context的startService方法可以啟動(dòng)一個(gè)Service:
Intent intentService = new Intent(this,MyService.class);
startService(intentService);
?
通過Context的bindService方法即可以綁定的方式啟動(dòng)一個(gè)Service:
Intent intentService = new Intent(this,MyService.class);
bindService(intentService,mServiceConnection,BIND_AUTO_CREATE);
Service的啟動(dòng)過程從ContextWrapper的startService開始。
Service的綁定過程從ContextWrapper的bindService開始。
4、BroadcastReceiver的工作過程? ? ? ? ? ? ? ? ? ? ??
動(dòng)態(tài)注冊(cè)的廣播需要在合適的時(shí)機(jī)進(jìn)行解注冊(cè),采用unregisterReceiver方法。
廣播的靜態(tài)注冊(cè)由PMS(packageManagerService)來(lái)完成整個(gè)注冊(cè)過程。
動(dòng)態(tài)注冊(cè)過程是從ContextWrapper的registerReceiver方法開始的,和Activity和Service一樣。
?
廣播的發(fā)送有幾種類型:普通廣播、有序廣播和粘性廣播。
廣播的發(fā)送開始于ContextWrapper的sendBroadcast方法,由ContextImpl去處理,ComtextImpl直接向AMS發(fā)起一個(gè)異步請(qǐng)求用于發(fā)送廣播。
?
5、ContentProvider的工作過程? ? ? ? ? ? ? ? ? ? ? ? ? ?
ContentProvider的onCreate方法要先于Application的onCreate方法執(zhí)行。
當(dāng)一個(gè)應(yīng)用啟動(dòng)時(shí),入口方法是ActivityThread的main方法,main方法是一個(gè)靜態(tài)方法,在main方法中創(chuàng)建ActivityThread的實(shí)例并創(chuàng)建主線程的消息隊(duì)列,然后再ActivityThread的attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法并將ActivityThread對(duì)象提供給AMS。
ActivityThread是一個(gè)Binder對(duì)象,它的Binder接口是IApplicationThread,主要用于ActivityThread和AMS之間的通信。
轉(zhuǎn)載于:https://www.cnblogs.com/fankongkong/p/7484835.html
總結(jié)
- 上一篇: 做梦梦到手机碎成两半是什么意思
- 下一篇: hdu 6183 线段树的空间优化