天天看點

安卓跨程序通信之Aidl教程詳解(一)

安卓多程序通信主要有四大方案:1,Activity 2,Broadcast Receiver 3,Content Prodiver 4,Service

1,Activity

Intent intent = new Intent();

intent.setAction(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:18702531326"));

startActivity(intent);

打電話的權限uses-permission android:name="android.permission.CALL_PHONE"/

目前應用和手機本身的打電話子產品是兩個程序,通過設定Action和傳遞資料給系統打電話子產品就可以将電話号碼跨程序傳遞

2,Broadcast Receiver

這個更好了解了,廣播分标準和有序,即異步和同步,每個訂閱了廣播的接受者的能收到資料(沒有被攔截),但這個方式是被動的,它們無法互動,對于絕大多數的業務需求來說都需要請求網絡資料并計算傳回

3,Content Prodiver

内容提供者,安卓四大元件之一,在應用A中建立一個SharedPreferences并寫入資料設定權限為Context.MODE_WORLD_READABLE,這樣應用B通過A的包名和Key就可以通路這個資料,但是官方已不太建議使用這種方式,它不是程序安全的。

4,Service

Aidl目前來說是多程序普遍運用的技術,那麼下面看一下通過Aidl怎麼實作程序通信

程序通信肯定有傳輸資料和接受并返還資料,先建立兩個項目,一個為AidlDemo1作為Service,另一個為AidlDemo2作為Client

先把Service項目切換到Android模式下,然後再建立aidl檔案夾

建立aidl檔案夾

在aidl檔案夾下建立包名

建立aidl檔案

切記字尾名 .aidl

Aidl源碼如下

編寫供Client項目調用的Service

把aidl匿名實作類指派給iBinder

把Service項目中的aidl檔案拷貝到Client項目,切記包名和檔案名必須一緻,然後再同步項目

private IMyAidlInterface iMyAidlInterface;

private ServiceConnectionconn=newServiceConnection() {

@Override

//當Service綁定并連接配接成功後調用,此時的service參數是Service項目傳回的aidl實作

public void onServiceConnected(ComponentName name,IBinder service) {

iMyAidlInterface= IMyAidlInterface.Stub.asInterface(service);

}

//斷鍊時清空,節約記憶體

public void onServiceDisconnected(ComponentName name) {

iMyAidlInterface=null;

};

private void initService() {

Intent intent =new Intent();

//第一個參數是Service項目中的MyService所屬包名,第二個為MyService的全路徑名稱

intent.setComponent(newComponentName("com.example.administrator.aidldemo1",

"com.example.administrator.aidldemo1.MyService"));

//安卓5.0以後不允許隐式啟動Service

intent.setAction("aidl");

bindService(intent,conn,Context.BIND_AUTO_CREATE);

調用aidl

iMyAidlInterface.getCount(num1,num2);

最後别忘了解綁服務

protected voidonDestroy() {

super.onDestroy();

unbindService(conn);

在運作Client項目時可能會報aidl方法無法找到的異常,此時隻需要cliean Project,然後同步一下,運作即可

下一篇寫Aidl的複雜資料類型傳遞以及aidl的原了解析

如有不當,歡迎留言。

繼續閱讀