Android IPC之AIDL
来源:互联网 发布:淘宝店铺查封怎么处理 编辑:程序博客网 时间:2024/05/17 04:26
什么是AIDL:
AIDL即android interface definition language--android接口定义语言(通过android系统底层间接通讯。AIDL基于service),用于进程之间的通信,进程之间为何不能直接通信,而需要一些机制呢?(当然是进程之间不能共享内存导致的咯(^_^) )
什么时候使用AIDL才恰到好处呢:
对android IPC的通信方法做个比较就可明白一二了
开发环境
android studio操作步骤:new->folder->AIDL 生成AIDL目录
从图片中可以看到不管是哪种目录,AIDL文件夹和java都是同级的(这点是和Eclipse是不同的),再将AIDL创建好之后,在android studio中一定要先编译一次,否则无法调用哦
实例:
最简单的计算题,求两个数的和……
在客户端输入两个数,要求在服务器端计算出两个数的和,然后将计算结果返回,哦哦,文字表达可能并不显而易见,来副图
新建一个工程,之后新建一个module,我这儿是clientaidl
服务端app
new->folder->AIDL Folder生成目录新建一个aidl文件
// IMyAidlInterface.aidlpackage com.vickay.aidltest;// Declare any non-default types here with import statementsinterface IMyAidlInterface { //计算两个数的和 int add(int num1,int num2);}
新建一个service,为啥?看博文开头
public class vickayService extends Service { /** * 当客户端绑定到该服务的时候 会执行onBind代码 * @param intent * @return */ @Override public IBinder onBind(Intent intent) { return iBinder; } private IBinder iBinder = new IMyAidlInterface.Stub(){ @Override public int add(int num1, int num2) throws RemoteException { //Log.d("TAG","收到了来自客户端的请求,输入的参数是" + num1 + "和" + num2); return num1 + num2; } };}
在清单文件中记得注册该service
<service android:name=".vickayService" android:enabled="true" android:exported="true" />
客户端app
新建一个AIDL文件,要求和服务端的AIDL同包名,同名称(直接复制粘贴)
MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener { private EditText mNum1; private EditText mNum2; private EditText result; private Button cal; IMyAidlInterface iMyAidlInterface; private ServiceConnection conn = new ServiceConnection() { //当与服务端连接成功时 @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { //拿到了远程的服务 iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder); } //当与服务端断开连接时 @Override public void onServiceDisconnected(ComponentName name) { //回收资源 iMyAidlInterface = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //软件已启动就绑定服务 bindService(); } private void initView(){ mNum1 = (EditText) findViewById(R.id.num1); mNum2 = (EditText) findViewById(R.id.num2); result = (EditText) findViewById(R.id.result); cal = (Button) findViewById(R.id.cal); cal.setOnClickListener(this); } @Override public void onClick(View v) { int num1 = Integer.parseInt(mNum1.getText().toString()); int num2 = Integer.parseInt(mNum2.getText().toString()); int res; try { res = iMyAidlInterface.add(num1,num2); result.setText(res + ""); } catch (RemoteException e) { e.printStackTrace(); result.setText("远程调用错误"); } } private void bindService(){ //获取到服务端 Intent intent = new Intent(); //android5.0以后必须显示intent启动绑定服务 intent.setComponent(new ComponentName("com.vickay.aidltest","com.vickay.aidltest.vickayService")); bindService(intent,conn, Context.BIND_AUTO_CREATE); } //当activity被销毁的时候解除绑定 @Override protected void onDestroy() { super.onDestroy(); unbindService(conn); }}
最后在运行的时候,一定要保证服务端开启,否则会有空指针异常
AIDL还有其他的东西,下篇再记录
源码下载
如记录有误,欢迎指正!!!
0 0
- Android IPC之AIDL
- Android IPC 之AIDL
- Android IPC之AIDL
- Android IPC 之 AIDL
- Android IPC之AIDL
- Android IPC之AIDL浅谈
- android IPC机制之 AIDL
- android进程间通信(IPC)之AIDL
- 【Android机制】IPC机制之AIDL
- Android IPC 之 AIDL(一)
- Android IPC 之 AIDL (二)
- Android进程间通信(IPC)之AIDL
- Android IPC机制之AIDL的使用
- Android IPC之AIDL使用解析
- Android IPC之AIDL的使用
- Android IPC通信之AIDL理解
- IPC之AIDL简析
- IPC通信之AIDL
- android开发中,截取百度地图的方法
- Matlab自定义函数的几种方法
- 调用startactivityforresult后,onactivityresult立刻响应问题
- 用函数调用的方法求字符串的最大值和最小值
- ssh操作服务器命令
- Android IPC之AIDL
- Set Matrix Zeroes
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- Android下音频进行转码(一)
- 以管理员身份运行cmd
- Gradle For Android
- JAVA的反射机制
- Android网络编程之Socket
- 解决gdb 调试 core 文件函数名显示为问号的问题