您好,登錄后才能下訂單哦!
怎么解析Android進(jìn)程以及進(jìn)程的安全性,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
如果調(diào)用者發(fā)起另外一個(gè)Android進(jìn)程,方法在另外一個(gè)線程中運(yùn)行,這個(gè)線程在和IBinder對象在一個(gè)線程池中,因?yàn)橐粋€(gè)服務(wù)可能有多個(gè)客戶端請求,不止一個(gè)線程池會在同一時(shí)間調(diào)用IBinder的方法。
這個(gè)屬性可以組件運(yùn)行的進(jìn)程。這個(gè)屬性可以配置組件在一個(gè)獨(dú)立進(jìn)程運(yùn)行,或者多個(gè)組件在同一個(gè)進(jìn)程運(yùn)行。甚至可以多個(gè)程序在一個(gè)進(jìn)程中運(yùn)行-如果這些程序共享一個(gè)User ID并給定同樣的權(quán)限。<application> 節(jié)點(diǎn)也包含 process 屬性,用來設(shè)置程序中所有組件的默認(rèn)進(jìn)程。
所有的組件在此進(jìn)程的Android進(jìn)程中示例化,系統(tǒng)對這些組件的調(diào)用從主線程中分離。并非每個(gè)對象都會從主線程中分離。一般來說,響應(yīng)例如View.onKeyDown()用戶操作的方法和通知(后面會在Component Lifecycles談到)的方法也在主線程中運(yùn)行。
這就表示,組件被系統(tǒng)調(diào)用的時(shí)候不應(yīng)該長時(shí)間運(yùn)行或者阻塞操作(如網(wǎng)絡(luò)操作或者計(jì)算大量數(shù)據(jù)),因?yàn)檫@樣會阻塞進(jìn)程中的其他組件??梢园堰@類操作從主線程中分離,后面的Threads, 章節(jié)會降到。當(dāng)更加常用的進(jìn)程無法獲取足夠內(nèi)存,Android可能會關(guān)閉不常用的進(jìn)程。下次啟動程序的時(shí)候會有一次啟動進(jìn)程。
當(dāng)決定哪個(gè)進(jìn)程需要被關(guān)閉的時(shí)候, Android會考慮哪個(gè)對用戶更加有用。如,Android會傾向于關(guān)閉一個(gè)長期不顯示在界面的進(jìn)程來支持一個(gè)經(jīng)常顯示在界面的進(jìn)程。是否關(guān)閉一個(gè)進(jìn)程決定于組件在進(jìn)程中的狀態(tài),參見后面的章節(jié)Component Lifecycles.
即使為組件分配了不同的進(jìn)程,有時(shí)候也需要再分配Android進(jìn)程。比如用戶界面需要很快對用戶進(jìn)行響應(yīng),因此某些費(fèi)時(shí)的操作,如網(wǎng)絡(luò)連接、下載或者非常占用服務(wù)器時(shí)間的操作應(yīng)該放到其他線程。
線程通過java的標(biāo)準(zhǔn)對象Thread 創(chuàng)建. Android 提供了很多方便的管理Android進(jìn)程的方法:— Looper 在線程中運(yùn)行一個(gè)消息循環(huán); Handler 傳遞一個(gè)消息; HandlerThread 創(chuàng)建一個(gè)帶有消息循環(huán)的線程。
遠(yuǎn)程調(diào)用Remote procedure callsAndroid有一個(gè)遠(yuǎn)程調(diào)用(RPCs) 的輕量級機(jī)制— 通過這個(gè)機(jī)制,方法可以在本地調(diào)用,在遠(yuǎn)程執(zhí)行(在其他進(jìn)程執(zhí)行),還可以返回一個(gè)值。要實(shí)現(xiàn)這個(gè)需求,方法調(diào)用必須分解方法調(diào)用,并且所有要傳遞的數(shù)據(jù)必須是操作系統(tǒng)可以訪問的級別。從本地的進(jìn)程和內(nèi)存地址傳送到遠(yuǎn)程的進(jìn)程和內(nèi)存地址并在遠(yuǎn)程處理和返回。
返回值必須向相反的方向傳遞。Android提供了做以上操作的代碼,所以開發(fā)者可以專注于實(shí)現(xiàn)RPC的接口。
一個(gè)RPC接口只能有一個(gè)方法。所有的方法都是同步執(zhí)行的(直到遠(yuǎn)程方法返回,本地方法才結(jié)束阻塞),沒有返回值的時(shí)候也是如此。
簡單來說,這個(gè)機(jī)制是這樣的:使用IDL (interface definition language).定義你想要實(shí)現(xiàn)的接口, aidl 工具可以生成用于java的接口定義,本地和遠(yuǎn)程都要使用這個(gè)定義。它包含2個(gè)類,見下圖:
inner類包含了所有的管理遠(yuǎn)程程序(符合IDL描述的接口)所需要的代碼。所有的inner類實(shí)現(xiàn)了IBinder 接口.其中一個(gè)在本地使用??梢圆还芩拇a;另外一個(gè)叫做Stub繼承了 Binder 類。為了實(shí)現(xiàn)遠(yuǎn)程調(diào)用Android進(jìn)程,這個(gè)類包含RPC接口。開發(fā)者可以繼承Stub類來實(shí)現(xiàn)需要的方法。
一般來說,遠(yuǎn)程進(jìn)程會被一個(gè)service管理(因?yàn)閟ervice可以通知操作系統(tǒng)這個(gè)進(jìn)程的信息并和其他進(jìn)程通信),它也會包含aidl 工具產(chǎn)生的接口文件,Stub類實(shí)現(xiàn)了遠(yuǎn)處那個(gè)方法。服務(wù)的客戶端只需要aidl 工具產(chǎn)生的接口文件。
以下是如何連接服務(wù)和客戶端調(diào)用:
◆服務(wù)的客戶端(本地)會實(shí)現(xiàn)onServiceConnected() 和onServiceDisconnected() 方法,這樣,當(dāng)客戶端連接或者斷開連接的時(shí)候可以獲取到通知。通過 bindService() 獲取到服務(wù)的連接。
◆服務(wù)的 onBind() 方法中可以接收或者拒絕連接,取決它收到的intent (intent通過 bindService()方法連接到服務(wù)). 如果服務(wù)接收了連接,會返回一個(gè)Stub類的實(shí)例.
◆如果服務(wù)接受了連接,Android會調(diào)用客戶端的onServiceConnected() 方法,并傳遞一個(gè)Ibinder對象(系統(tǒng)管理的Stub類的代理),通過這個(gè)代理,客戶端可以連接遠(yuǎn)程的服務(wù)。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。