Android中AIDL異常

在調試AIDL服務的時候,一開始遇到了下面這個問題:

 java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.renkai.aidl_test.IMyService }
看過很多大神的回答,說是Android 5.0之後AIDL就不支持隱式聲明瞭,總結了網上的方法,大致有兩種,一種是通過Intent的setAction和setPackage方法來聲明Service服務;另一種是在實例化Intent的時候就傳入需要的服務類。這裏主要講第一種方法,客戶端代碼如下:

Intent intent = new Intent();
intent.setAction("com.example.renkai.aidl_test.IMyService");
intent.setPackage("com.example.renkai.aidl_test");
startService(intent);
bindService(intent,serviceConnection,
          Context.BIND_AUTO_CREATE);
通過setAction方法將服務端傳入,注意這裏的參數都是你自己在Service中定義的Action和Service的包名,如下:
<service android:name=".MyService" >
    <intent-filter>
         <action android:name="com.example.renkai.aidl_test.IMyService"/>
    </intent-filter>
</service>
這樣就可以解決上述的異常了(原以爲就這樣結束了,天真的我眼淚掉下來大哭),在調用服務端的方法時,卻又出現了錯誤:

java.lang.SecurityException: Binder invocation to an incorrect interface
解決方法就是,保證兩端的AIDL接口一致,必須是完全一致,即包名和文件名均一致,所以我就直接將服務端的AIDL下的文件夾copy到了客戶端的AIDL文件夾下,重建到一半,出現了一大堆問題啊,最後在客戶端直接創建一個和服務端文件名完全一樣的文件夾,最終解決問題。

1.服務端


2.客戶端



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章