android 进程间通信之aidl

来源:互联网 发布:sql注入 编辑:程序博客网 时间:2024/05/19 07:07

android 进程间通信之aidl

android 进程间通信之aidl 多个客户端, 多线程, IPC 

第一步: 创建一个ITestAidl.aidl 文件

Eclipse 下回自动在gen文件夹下生成一个相应的ITestAidl.java文件

第二步: 创建一个服务, 

返回的一个binder对象  继承ITestAidl.Stub   

第三步: 在客户端, 绑定服务, 通过ServiceConnection 获取IBinder对象, 

获取服务器的数据



Service中返回一个IBinder对象实现了 aidl接口中的Stub (继承了IBinder)

客户端绑定服务,通过ServiceConnection 获取Service中的IBinder,

在客户端进行传输数据, 并返回结果, 


aidl底层实现



客户端实现:

package com.android.hellosumaidl;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;public class HelloSumAidlActivity extends Activity {IAdditionService service;AdditionServiceConnection connection;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initService();Button buttonCalc = (Button)findViewById(R.id.buttonCalc);buttonCalc.setOnClickListener(new OnClickListener() {TextView result = (TextView)findViewById(R.id.result);EditText value1 = (EditText)findViewById(R.id.value1);EditText value2 = (EditText)findViewById(R.id.value2);@Overridepublic void onClick(View v) {int v1, v2, res = -1;v1 = Integer.parseInt(value1.getText().toString());v2 = Integer.parseInt(value2.getText().toString());try {res = service.add(v1, v2);} catch (RemoteException e) {e.printStackTrace();}result.setText(Integer.valueOf(res).toString());}});}@Overrideprotected void onDestroy() {super.onDestroy();releaseService();}/* * This inner class is used to connect to the service */class AdditionServiceConnection implements ServiceConnection {public void onServiceConnected(ComponentName name, IBinder boundService) {service = IAdditionService.Stub.asInterface((IBinder)boundService);Toast.makeText(HelloSumAidlActivity.this, "Service connected", Toast.LENGTH_LONG).show();}public void onServiceDisconnected(ComponentName name) {service = null;Toast.makeText(HelloSumAidlActivity.this, "Service disconnected", Toast.LENGTH_LONG).show();}}/* * This function connects the Activity to the service */private void initService() {connection = new AdditionServiceConnection();Intent i = new Intent();i.setClassName("com.android.hellosumaidl", com.android.hellosumaidl.AdditionService.class.getName());boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);}/* * This function disconnects the Activity from the service */private void releaseService() {unbindService(connection);connection = null;}}



将gen文件夹下的.aidl生成的IAdditionService.java

文件 拷出来看以一看:



public interface IAdditionService extends android.os.IInterface{/** Local-side IPC implementation stub class. */public static abstract class Stub extends Binder implements IAdditionService{private static final String DESCRIPTOR = "com.android.hellosumaidl.IAdditionService";/** 构造函数. */public Stub(){this.attachInterface(this, DESCRIPTOR);}/**  创建一个IBinder对象 在需要代理的时候 */public static IAdditionService asInterface(IBinder obj){if ((obj==null)) {return null;}IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof IAdditionService))) {return ((IAdditionService)iin);}return new IAdditionService.Stub.Proxy(obj);}@Override public  IBinder asBinder(){return this;}@Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws android.os.RemoteException{switch (code){case INTERFACE_TRANSACTION:{reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_add:{data.enforceInterface(DESCRIPTOR);int _arg0;_arg0 = data.readInt();int _arg1;_arg1 = data.readInt();int _result = this.add(_arg0, _arg1);reply.writeNoException();reply.writeInt(_result);return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements IAdditionService{private IBinder mRemote;Proxy(android.os.IBinder remote){mRemote = remote;}@Override public android.os.IBinder asBinder(){return mRemote;}public java.lang.String getInterfaceDescriptor(){return DESCRIPTOR;}// You can pass the value of in, out or inout// The primitive types (int, boolean, etc) are only passed by in@Override public int add(int value1, int value2) throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();int _result;try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(value1);_data.writeInt(value2);mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);_reply.readException();_result = _reply.readInt();}finally {_reply.recycle();_data.recycle();}return _result;}}static final int TRANSACTION_add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);}// You can pass the value of in, out or inout// The primitive types (int, boolean, etc) are only passed by inpublic int add(int value1, int value2) throws android.os.RemoteException;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅蓝3s被锁了怎么办 小米5x的4g网速慢怎么办 红米一体机与后盖有裂缝怎么办? 红米4x喇叭坏了怎么办 红米4x电池坏了怎么办 小米电视4a开不了机怎么办 小米x4手机下面三个键失灵怎么办 红米4a一直重启怎么办 红米4a手机一直关机重启怎么办 红米5A手机4G信号差怎么办 红米4x手机黑屏打不开怎么办 红米手机前置摄像头用不了怎么办 红米4a手机电池不耐用怎么办 红米6全网通联通网络不好怎么办 红米手机死机了怎么办不可拆卸电池 厦华电视指示灯亮但打不开机怎么办 oppo一体机的开机键坏了怎么办 小米手机长时间没用开不了机怎么办 红米2a充电坏了怎么办? 红米手机恢复出厂设置失败怎么办 红米关机强行恢复出厂失败怎么办 红米2a太卡了怎么办 红米2a上网好卡怎么办 红米1内部存储空间坏了怎么办 红米3s开关机键失灵怎么办 红米3s下面三个键失灵怎么办 红米3s手机掉水怎么办 红米手机用久了卡怎么办 红米4x手机不支持计步怎么办 红米4x手机耗电快怎么办 红米4a一体机手机死机怎么办 红米4x打王者卡怎么办 红米5 4g信号不稳定怎么办 红米3x玩游戏卡顿怎么办 红米3开不了机了怎么办 苹果手机装了sim卡没反应怎么办 小米手机打电话的图标没了怎么办 租房时和房东没签协议装修怎么办 三星安卓手机忘记锁屏密码怎么办 刷机了支付宝的余额宝钱没了怎么办 手机刷机支付宝里面的钱怎么办