android Service學習之AIDL

一、什麼是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去實現簡單的兩個整數相加!

相關文章
相關標籤/搜索