【Android進階】-AIDL使用解析

Android系統中,各應用程序都運行在自己的進程中,通常情況下,各進程之間無法直接進行數據交換。爲了實現這種跨進程通信(InterProcess communication,簡稱IPC),Android提供了AIDL Service。


一、AIDL Service簡介

  1. Android的遠程Service調用與Java的遠程方法調用(RMI)基本相似,都是先定義一個遠程調用接口,然後爲該接口提供一個實現類。
  2. 本地Service的onBind方法會將Service的代理對象(IBinder對象)傳遞給客戶端,遠程Service的onBind方法會將IBinder對象的代理對象(Stub對象)傳遞給Service。

二、創建AIDL文件

以下代碼定義了一個aidl文件,其中定義了一個供客戶端調用的方法getCount()。
package org.iti.tailyou.aidlservice;
interface ICount{
int getCount();
}
  • AIDL定義的接口文件必須以.aidl結尾;
  • AIDL接口中用到的數據類型,除了基本類型、String、List、Map、CharSequence外,其他類型都需要導包。
  • 定義好aidl接口後,ADT工具會自動生成一個ICount.java接口,該接口中包含一個Stub內部類,該內部類實現了IBinder、ICount兩個接口。



三、定義Service實現類,將接口暴露給客戶端

該Service實現類的onBind()方法所返回的IBinder對象是ADT所生成的ICount.Stub的子類。
package org.iti.tailyou.aidlservice;

import java.util.Timer;
import java.util.TimerTask;

import org.iti.tailyou.aidlservice.ICount.Stub;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class AIDLService extends Service {
	private int count = 0;

	public class CountBinder extends Stub {

		@Override
		public int getCount() throws RemoteException {
			return count;
		}
	}

	@Override
	public IBinder onBind(Intent arg0) {
		new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				count++;
			}
		}, 1000l,1000l);
		return new CountBinder();
	}
}


四、客戶端調用遠程Service

必須將服務端定義的aidl文件拷貝到客戶端。


客戶端調用代碼:
package org.iti.tailyou.aidlclient;

import org.iti.tailyou.aidlservice.ICount;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends ActionBarActivity implements OnClickListener {
	private ICount countService;
	private ServiceConnection sc = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			countService = ICount.Stub.asInterface(service);
			try {
				Log.i("",
						"------------------------count "
								+ countService.getCount());
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btnBind).setOnClickListener(this);
		findViewById(R.id.btnUnbind).setOnClickListener(this);
		findViewById(R.id.btnGetCount).setOnClickListener(this);

	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.btnBind:
			bindService(new Intent("org.iti.tailyou.aidlservice.AIDLService"),
					sc, Service.BIND_AUTO_CREATE);
			break;
		case R.id.btnUnbind:
			unbindService(sc);
			break;
		case R.id.btnGetCount:
			try {
				Log.i("",
						"------------------------count "
								+ countService.getCount());
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			break;

		default:
			break;
		}
	}
}

Demo下載地址:http://download.csdn.net/detail/tailyou/9074391

發佈了56 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章