生活随笔
收集整理的這篇文章主要介紹了
Framework中的AIDL(原)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?? ? ? 在上一節(jié)(應(yīng)用層的AIDL調(diào)用)中我們介紹了應(yīng)用層中的AIDL用法, 這一節(jié)中,我們來(lái)看一下系統(tǒng)Framework層中更為普通的AIDL用法。
? ? ? ? 為了便于分析,我們挑選了ITelephonyRegistry這個(gè)SystemService進(jìn)行分析。這個(gè)服務(wù)的主要作用就是對(duì)通話相關(guān)的事件進(jìn)行監(jiān)聽,我們把重心放在AIDL的實(shí)現(xiàn)結(jié)構(gòu)上,不去關(guān)注ITelephonyRegistry具體的實(shí)現(xiàn)。
一、AIDL文件相關(guān)
? ? ? ? 先來(lái)看一下這個(gè)服務(wù)的AIDL文件:
[java]?view plaincopy
@ITelephonyRegistry.aidl?? interface?ITelephonyRegistry?{?? ????void?listen(String?pkg,?IPhoneStateListener?callback,?int?events,?boolean?notifyNow);?? ????void?notifyCallState(int?state,?String?incomingNumber);?? ????void?notifyServiceState(in?ServiceState?state);?? ????void?notifySignalStrength(in?SignalStrength?signalStrength);?? ????void?notifyMessageWaitingChanged(boolean?mwi);?? }?? ? ? ? ? 再來(lái)看這個(gè)服務(wù)的真正實(shí)現(xiàn): [java]?view plaincopy
@TelephonyRegistry.java?? class?TelephonyRegistry?extends?ITelephonyRegistry.Stub?{?? ????TelephonyRegistry(Context?context)?{?? ????????......?? ????}?? ????void?listen(String?pkg,?IPhoneStateListener?callback,?int?events,?boolean?notifyNow){?? ????????......?? ????}?? ????void?notifyCallState(int?state,?String?incomingNumber){?? ????????......?? ????}?? ????void?notifyServiceState(in?ServiceState?state){?? ????????......?? ????}?? ????void?notifySignalStrength(in?SignalStrength?signalStrength){?? ????????......?? ????}?? ????void?notifyMessageWaitingChanged(boolean?mwi){?? ????????......?? ????}?? }?? ? ? ? ? 上面的兩個(gè)文件是這個(gè)服務(wù)的核心部分,aidl文件規(guī)定了這個(gè)服務(wù)的功能,而java文件是對(duì)功能的具體實(shí)現(xiàn)。但是,此時(shí)的TelephonyRegistry并沒有繼承Service的類,也就是說,當(dāng)前他并不具備作為一個(gè)Service的資格。那么他是如何變成一個(gè)服務(wù)的呢?
二、服務(wù)的注冊(cè)過程
? ? ? ? 我們?cè)赟ystemService中找到了答案。 [java]?view plaincopy
@SystemServer.java?? class?ServerThread?extends?Thread?{?? ????@Override?? ????public?void?run()?{?? ????????try?{?? ????????????telephonyRegistry?=?new?TelephonyRegistry(context);?? ????????????ServiceManager.addService("telephony.registry",?telephonyRegistry);?? ????????}?? ????}?? }?? ? ? ? ? 我們看到,在這一步中,把telephonyRegistry對(duì)象(也就是ITelephonyRegistry.Stub的子類對(duì)象)作為一個(gè)Service注冊(cè)給了ServiceManager。并且注冊(cè)的名字是“telephony.registry” ? ? ? ? 有了這一步,TelephonyRegistry就可以作為服務(wù)提供者向客戶端開放了。也就是說,有了這一步,TelephonyRegistry才算上是一個(gè)真正的Service,可以接受客戶端的連接申請(qǐng)。 ? ? ? ? 那么接下來(lái),我們?cè)趺吹玫竭@個(gè)Service呢?
三、如何得到注冊(cè)的服務(wù)
? ? ? ? 既然通過ServiceManager注冊(cè)了服務(wù),我們就需要再次通過ServiceManager得到它的服務(wù)對(duì)象。 [java]?view plaincopy
private?ITelephonyRegistry?sRegistry;?? sRegistry?=?ITelephonyRegistry.Stub.asInterface(ServiceManager.getService("telephony.registry"));?? ? ? ? ? 通過這樣的方法,我們就得到了ITelephonyRegistry.aidl的對(duì)象sRegistry。
四、流程總結(jié)
? ? ? ? 我們現(xiàn)在回顧一下這種AIDL服務(wù)的框架。 ? ? ? ??我們通過繼承ITelephonyRegistry.Stub父類去實(shí)現(xiàn)AIDL中規(guī)定的接口,然后把TelephonyRegistry作為ServiceManager注冊(cè)給SystemService??蛻舳丝梢酝ㄟ^ServiceManager得到TelephonyRegistry的對(duì)象,然后就可以去調(diào)用AIDL中定義的接口了。 原文地址:http://blog.csdn.net/u010961631/article/details/12081641
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的Framework中的AIDL(原)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。