什麼情況下要使用AIDL
使用AIDL只有在你允許來自不同應用的客戶端跨進程通信訪問你的service,並且想要在你的service種處理多線程的時候纔是必要的。 如果你不需要執行不同應用之間的IPC併發,你應該通過實現Binder建立你的接口,或者如果你想執行IPC,但是不需要處理多線程。那麼使用Messenger實現你的接口。
定義一個AIDL接口的步驟
必須在一個.aidl文件中使用Java編程語言語法定義你的AIDL接口,然後在提供service的應用中和任何綁定到這個service的應用中的源代碼中(在src目錄嚇)保存它。
當你編譯包含.aidl文件的應用時,Android SDK工具基於這個.aidl文件生成一個IBinder接口,並且把它保存到項目的gen目錄嚇.service必須恰當的實現這個IBinder接口 之後客戶端應用可以綁定到這個服務上,然後從IBinder調用方法來執行IPC。
使用AIDL建立一個鄰接的service需要遵循下面的步驟:
1. 建立.aidl文件
這個文件使用方法簽名定義了語言接口
2.實現這個接口
Android SDk工具基於你的.aidl文件使用java語言生成一個接口 這個接口有一個內部抽象類,叫做Stub,它是繼承Binder並且實現你AIDL接口的 你必須繼承這個Stub類並且實現這些方法
3.暴露這個接口給客戶端
實現一個service並且覆蓋onBind()方法返回你的Stub實現類。
你的.aidl文件必須被複制到其他應用程序中來讓他們訪問你service的接口,你必須維護原始接口的支持(向後兼容)
IService.aidl
package com.example.aidl; interface IService { String hello(String name); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在server項目中建立服務類
當你編譯你的應用時,Android SDK工具生成一個.java接口文件用你的.aidl文件命名生成的接口包含一個名字爲Stub的子類,這是一個它父類的抽象實現,並且聲明瞭.aidl中所有的方法。
Stub也定義了一些輔助的方法,最顯著的就是asInterface(),它是用來接收一個IBinder(通常IBinder傳遞給客戶端的onServiceConnected()回調方法)並且返回一個Stub接口的實例 。一旦你爲service實現了接口,你需要把它暴露給客戶端,這樣他們才能綁定到上面 爲了給你的service暴露接口,繼承Service並且實現onBind()方法返回一個你實現生成的Stub類。
AIDLService.java
public class AIDLService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public IBinder onBind(Intent intent) { // Return the interface return new IService.Stub() { @Override public String hello(String name) throws RemoteException { // TODO Auto-generated method stub return "hello"+name; } }; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
在server項目AndroidManifest中申明Service
<service android:name="com.example.service.AIDLService" > <intent-filter> <action android:name="android.intent.action.AIDLService" /> </intent-filter> </service>
MainActivity.java
也可以參考:http://blog.csdn.net/u010513497/article/details/43701741
public class MainActivity extends Activity { IService RemoteService; //監聽服務 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.i("mConnection", service+""); RemoteService = IService.Stub.asInterface(service); try { String s= RemoteService.hello("finch"); Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initService(); } //連接服務 private void initService() { Intent i = new Intent( ); i.setAction("android.intent.action.AIDLService"); boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE); } //斷開服務 private void releaseService() { unbindService(mConnection); mConnection = null; } @Override protected void onDestroy() { super.onDestroy(); releaseService(); } }