一、什麼是AIDL?java
FAQ:百度百科上給出的解釋:android
Android系統中的進程之間不能共享內存,所以,須要提供一些機制在不一樣進程之間進行數據通訊。eclipse
爲了使其餘的應用程序也能夠訪問本應用程序提供的服務,Android系統採用了遠程過程調用(Remote Procedure Call,RPC)方式來實現。與不少其餘的基於RPC的解決方案同樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務的接口。咱們知道4個Android應用程序組件中的3個(Activity、BroadcastReceiver和ContentProvider)均可以進行跨進程訪問,另一個Android應用程序組件Service一樣能夠。所以,能夠將這種能夠跨進程訪問的服務稱爲AIDL(Android Interface Definition Language)服務。ide
二、如何建立一個簡單的AIDL項目?spa
FAQ:這裏給出在eclipse環境下建立生成AIDL的實例,ADDService是服務端,提供實現加法的運算方法,ADDClient是客戶端去調用服務端的方法,給出計算結果。代理
ADDService工程視圖:code
ADDClient工程視圖:xml
實現步驟:htm
(1)建立一個ADDService android工程,並在com.example.aidl包下實現名爲AddOp.aidl的接口,實現相似java接口實現。對象
package com.example.aidl; interface AddOp { // 除了沒有訪問權限,其餘和接口定義差很少 int addService(int a, int b); }
編譯後會自動生成這個文件:
這個裏面的代碼是使用代理模式來實現的,咱們通常是定義該接口的靜態內部類Stub的asInterface()方法,返回咱們的接口。
(2) 創建一個服務類AddOpService.java,並在其中實現了由aidl文件生成的java接口:
public class AddOpService extends Service { private static final String TAG = "AddOpService"; private IBinder binder = new AddOpBinder(); @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind..."); return binder; } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate..."); } // 服務提供的方法經過Binder對象提供給外部 private int add(int a, int b) { Log.i(TAG, "add...a = " + a + ";b = " + b); return a + b; } class AddOpBinder extends AddOp.Stub {// 繼承aidl生成的存根 @Override public int addService(int a, int b) throws RemoteException {// 實現次方法 return add(a, b);// 調用實現的方法 } } }
(3) 配置ADDService工程的AndroidManifest.xml,設置Service隱式啓動的action:
<service android:name="com.example.addservice.AddOpService" > <intent-filter> <action android:name="com.example.aidl.AddOp.MY_ACTION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
至此ADDService開發完畢,接下來開發ADDClient工程;
(4) 將ADDService下的aidl整個包com.example.aidl拷貝到ADDClient下如上面ADDClient工程視圖所示;
(5) 調用AddOp.java中的addService(int a, int b)方法去得出結果:
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText a, b; private TextView c; private Button add; private AddOp addOp; private ServiceConnection conn = new AddOpServiceConnection(); private static final String MY_ACTION = "com.example.aidl.AddOp.MY_ACTION"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate"); a = (EditText) findViewById(R.id.a); b = (EditText) findViewById(R.id.b); c = (TextView) findViewById(R.id.c); add = (Button) findViewById(R.id.add); Intent intent = new Intent(); intent.setAction(MY_ACTION); bindService(intent, conn, BIND_AUTO_CREATE);// 綁定服務 add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int addResult; try { addResult = addOp.addService(Integer.parseInt(a.getText().toString()), Integer.parseInt(b.getText().toString())); c.setText("" + addResult); } catch (Exception e) { } } }); } class AddOpServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "onServiceConnected"); addOp = AddOp.Stub.asInterface(service); // 將IBinder轉換成接口類型 } @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected"); addOp = null; } } }
至此,整個AIDL項目開發完畢,將兩個APK安裝到機器上,運行ADDClient這個APK,便可調用ADDService去實現簡單的兩個整數相加!