今天在做一個有關AIDL的例子的時候,遇到一個小問題,死活兩個進程就是無法通信。按着書上的例子做的(此處代碼出自瘋狂Android講義第2版),還是出錯,最后在網上查了下才知道是包名的問題。也就是說自己定義的那個AIDL接口所在的包的包名必須保持客戶端和服務器端一致。否則會報錯,程序強制退出。錯誤信息如下(事物綁定失敗):
在調試模式下會看到如下異常(目標調用異常)拋出:
之所以這樣是因為我的包名不一致,如下:
兩者所在的包不一樣,這是因為自己當時是直接復制的那個ICat.aidl文件,內容為:
1 package com.qc.aidlservice; 2 interface ICat 3 { 4 String getColor(); 5 double getWeight(); 6 }
因為其中涉及到導包,因為直接復制到服務端會報錯,所以在服務端的文件中我把需要導入的包名改成了如下的包:
1 package com.example.myaidlclientdemo; 2 interface ICat 3 { 4 String getColor(); 5 double getWeight(); 6 }
但是這樣就會出現上面所說的錯誤,其實這樣多此一舉反而造成了錯誤。最簡單的做法就是在編寫完服務器端代碼后直接將AIDL文件所在的包原封不動的復制到我們的客戶端。系統會自動為我們生成.java文件,簡單方便。如下:
最后需要注意的就是配置service的時候,千萬不能把service的屬性配置成android:exported="false",此例中為:
1 <service android:name=".AidlService" 2 android:exported="false"> 3 <intent-filter > 4 <action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/> 5 </intent-filter> 6 </service>
這樣配置外部應用當然無法訪問了啊(犯該錯誤的原因是在解決上篇博文里的警告問題是忘記改過來了,所以程序就一直強推,所以一定要細心細心再細心!!!)。
應該配置為:
1 <service android:name=".AidlService" 2 android:process=":remote"> 3 <intent-filter > 4 <action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/> 5 </intent-filter> 6 </service>