Android:使用AIDL实现进程间通讯

说明:

AIDL可以实现跨进程通讯,2个应用之间可以建立连接管道,并传递参数,连通期间可实现实时调用实时返回的功能,例如:三方应用调用支付应用提供的接口发起支付,支付应用完成支付后,使用三方应用的对象引用直接回调到三方应用,将支付结果返回给三方处理。


使用:

远程服务端(A应用):

public class PaymentService extends Service {
	private static IPayObserver mObserver;

	@Override
	public IBinder onBind(Intent intent) {
		return mPayService;
	}

	// IPayService.aidl实现
	private IPayService.Stub mPayService = new IPayService.Stub() {

		public void pay(String queryString, IPayObserver observer) throws RemoteException {
			payTask(queryString, observer);
		}

	};

	// 支付任务
	private synchronized void payTask(String queryString, IPayObserver observer) {
		this.mObserver = observer;
		// 调起支付界面
	}

	// 支付结果返回
	public static synchronized void onResult(final String result) {
		if (mObserver != null) {
			new Thread() {
				public void run() {
					try {
						mObserver.payResult(result == null ? "" : result);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}.start();
		}
	}

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		
		super.onDestroy();
	}

}

客户端(B应用):

public class MainActivity extends Activity {
	private IPayService mIPayService;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Intent i = new Intent();
		i.setAction("com...payment.PayService");// 设置Action  
		i.setPackage("com...");// 设置包名
		bindService(i, mServiceConnection, BIND_AUTO_CREATE);// 绑定到服务

	}

	// 点击事件中
	private void onClick() {
		try {
			String order = ""; // 订单参数串
			mIPayService.pay(order, mIPayObserver);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	private ServiceConnection mServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 获得远程IPayService实现
			mIPayService = IPayService.Stub.asInterface(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
	};

	IPayObserver mIPayObserver = new IPayObserver.Stub() {

		@Override
		public void payResult(String resultStr) throws RemoteException {
			// 处理返回数据
		}
	};

	@Override
	protected void onDestroy() {
		this.unbindService(mServiceConnection); // 解除绑定
		mServiceConnection = null;
		super.onDestroy();
	}

}


以下这2个文件必须在A和B两个应用中都放一份:

IPayService.aidl文件,用于远程(A应用)远程服务端实现:
interface IPayService {
        void pay(String orderStr, IPayObserver observer);
}

IPayObserver.aidl文件,用于客户端(B应用)实现,处理远程回调:
interface IPayObserver {
        void payResult(String resultStr);
}

你可能感兴趣的:(Android:使用AIDL实现进程间通讯)