關於AIDL客戶端與服務端交互的包名問題-package


今天在做一個有關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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM