http://blog.csdn.net/lmj623565791/article/details/38461079

如果知道AIDL和binder的原理,可以简单写一个不依赖AIDL的跨进程通信

不知道的话可以看这里:http://www.cnblogs.com/qlky/p/6720405.html

先看AIDL要做什么: 在binderProxy的onTransact中接收数据,并返回结果。

在自定义service的stub中实现函数,并返回stub

所以如果只用binder,在自定义service重写onTransact就行了

  1. package com.example.zhy_binder;
  2.  
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.Binder;
  6. import android.os.IBinder;
  7. import android.os.Parcel;
  8. import android.os.RemoteException;
  9. import android.util.Log;
  10.  
  11. public class CalcPlusService extends Service
  12. {
  13. private static final String DESCRIPTOR = "CalcPlusService";
  14. private static final String TAG = "CalcPlusService";
  15.  
  16. public void onCreate()
  17. {
  18. Log.e(TAG, "onCreate");
  19. }
  20.  
  21. @Override
  22. public int onStartCommand(Intent intent, int flags, int startId)
  23. {
  24. Log.e(TAG, "onStartCommand");
  25. return super.onStartCommand(intent, flags, startId);
  26. }
  27.  
  28. public IBinder onBind(Intent t)
  29. {
  30. Log.e(TAG, "onBind");
  31. return mBinder;
  32. }
  33.  
  34. public void onDestroy()
  35. {
  36. Log.e(TAG, "onDestroy");
  37. super.onDestroy();
  38. }
  39.  
  40. public boolean onUnbind(Intent intent)
  41. {
  42. Log.e(TAG, "onUnbind");
  43. return super.onUnbind(intent);
  44. }
  45.  
  46. public void onRebind(Intent intent)
  47. {
  48. Log.e(TAG, "onRebind");
  49. super.onRebind(intent);
  50. }
  51.  
  52. private MyBinder mBinder = new MyBinder();
  53.  
  54. private class MyBinder extends Binder
  55. {
  56. @Override
  57. protected boolean onTransact(int code, Parcel data, Parcel reply,
  58. int flags) throws RemoteException
  59. {
  60. switch (code)
  61. {
  62. case 0x110:
  63. {
  64. data.enforceInterface(DESCRIPTOR);
  65. int _arg0;
  66. _arg0 = data.readInt();
  67. int _arg1;
  68. _arg1 = data.readInt();
  69. int _result = _arg0 * _arg1;
  70. reply.writeNoException();
  71. reply.writeInt(_result);
  72. return true;
  73. }
  74. case 0x111:
  75. {
  76. data.enforceInterface(DESCRIPTOR);
  77. int _arg0;
  78. _arg0 = data.readInt();
  79. int _arg1;
  80. _arg1 = data.readInt();
  81. int _result = _arg0 / _arg1;
  82. reply.writeNoException();
  83. reply.writeInt(_result);
  84. return true;
  85. }
  86. }
  87. return super.onTransact(code, data, reply, flags);
  88. }
  89.  
  90. };
  91.  
  92. }

然后在客户端中需要序列化数据,并用transact把数据发送出去

  1. package com.example.zhy_binder_client03;
  2.  
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.ServiceConnection;
  8. import android.os.Bundle;
  9. import android.os.IBinder;
  10. import android.os.RemoteException;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.widget.Toast;
  14.  
  15. public class MainActivity extends Activity
  16. {
  17.  
  18. private IBinder mPlusBinder;
  19. private ServiceConnection mServiceConnPlus = new ServiceConnection()
  20. {
  21. @Override
  22. public void onServiceDisconnected(ComponentName name)
  23. {
  24. Log.e("client", "mServiceConnPlus onServiceDisconnected");
  25. }
  26.  
  27. @Override
  28. public void onServiceConnected(ComponentName name, IBinder service)
  29. {
  30.  
  31. Log.e("client", " mServiceConnPlus onServiceConnected");
  32. mPlusBinder = service;
  33. }
  34. };
  35.  
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState)
  38. {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41.  
  42. }
  43.  
  44. public void bindService(View view)
  45. {
  46. Intent intentPlus = new Intent();
  47. intentPlus.setAction("com.zhy.aidl.calcplus");
  48. boolean plus = bindService(intentPlus, mServiceConnPlus,
  49. Context.BIND_AUTO_CREATE);
  50. Log.e("plus", plus + "");
  51. }
  52.  
  53. public void unbindService(View view)
  54. {
  55. unbindService(mServiceConnPlus);
  56. }
  57.  
  58. public void mulInvoked(View view)
  59. {
  60.  
  61. if (mPlusBinder == null)
  62. {
  63. Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
  64. } else
  65. {
  66. android.os.Parcel _data = android.os.Parcel.obtain();
  67. android.os.Parcel _reply = android.os.Parcel.obtain();
  68. int _result;
  69. try
  70. {
  71. _data.writeInterfaceToken("CalcPlusService");
  72. _data.writeInt();
  73. _data.writeInt();
  74. mPlusBinder.transact(0x110, _data, _reply, );
  75. _reply.readException();
  76. _result = _reply.readInt();
  77. Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
  78.  
  79. } catch (RemoteException e)
  80. {
  81. e.printStackTrace();
  82. } finally
  83. {
  84. _reply.recycle();
  85. _data.recycle();
  86. }
  87. }
  88.  
  89. }
  90.  
  91. public void divInvoked(View view)
  92. {
  93.  
  94. if (mPlusBinder == null)
  95. {
  96. Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
  97. } else
  98. {
  99. android.os.Parcel _data = android.os.Parcel.obtain();
  100. android.os.Parcel _reply = android.os.Parcel.obtain();
  101. int _result;
  102. try
  103. {
  104. _data.writeInterfaceToken("CalcPlusService");
  105. _data.writeInt();
  106. _data.writeInt();
  107. mPlusBinder.transact(0x111, _data, _reply, );
  108. _reply.readException();
  109. _result = _reply.readInt();
  110. Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
  111.  
  112. } catch (RemoteException e)
  113. {
  114. e.printStackTrace();
  115. } finally
  116. {
  117. _reply.recycle();
  118. _data.recycle();
  119. }
  120. }
  121.  
  122. }
  123. }

不依赖AIDL的跨进程通信的更多相关文章

  1. android 远程Service以及AIDL的跨进程通信

    在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...

  2. AIDL跨进程通信

    Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...

  3. Service官方教程(11)Bound Service示例之2-AIDL 定义跨进程接口并通信

    Android Interface Definition Language (AIDL) 1.In this document Defining an AIDL Interface Create th ...

  4. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  5. 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了

    一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...

  6. Android随笔之——跨进程通信(一) Activity篇

    在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...

  7. 跨进程通信之Messenger

    1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级 ...

  8. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  9. Android-Messenger跨进程通信

    http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...

随机推荐

  1. How do I convert an IIR filter into a FIR filter in digital signal processing?

    Maybe you were asking if there is some kind of design tool allowing to convert an IIR filter into an ...

  2. 设计模式:Builder

    简介 建造者模式(Builder),将一个复杂对象的表示和它的构建分离,这样同样的构造过程可以创建出不同的对象状态. 类图 下面的Product是要创建的对象的目标类型,产品. Builder 创建一 ...

  3. [Ynoi2015]此时此刻的光辉(莫队)

    一道神题...自己写出来以后被卡常了...荣获洛谷最差解... 思路还是比较好想,对于每个数 \(\sqrt{n}\) 分块,对于 \(\sqrt{n}\) 以内的数,我们可以直接求出来.对于 \(\ ...

  4. 如何执行超过一百兆(100MB)的sql脚本?

    最近遇到一个问题,在sqlserver的查询分析器里面执行一个超过100MB的数据库脚本,发现老是报“引发类型为“System.OutOfMemoryException”的异常”,上网查了一下,主要是 ...

  5. 【转】如何用css限制文字长度,使溢出的内容用省略号…显示

    文章转自这里(现在貌似被黑了,建议不要点击了) ps:因在该地方没看到转载按钮,复制下存到这里以待自己方便,别人能看到帮助一下更是乐意之至,效果亲测可以实现,兼容IE.谷歌.火狐 由于文字内容长度的不 ...

  6. vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件

    vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...

  7. 使用ServiceStack改造我们的项目

    ServiceStack是一个NET环境下的开源框架集合 包括轻量级的Orm框架,数据库访问,Json处理,Redis驱动等多个模块,我们可以按需选择使用 serviceStack.Ormlite s ...

  8. ElasticSearch入门2: 基本用法

    基本用法:  一.索引创建 (启动集群和索引请看上一篇文章:http://www.cnblogs.com/liuxiaoming123/p/8081883.html) 1.打开浏览器,输入请求:htt ...

  9. 源码分析篇 - Android绘制流程(二)measure、layout、draw流程

    performTraversals方法会经过measure.layout和draw三个流程才能将一帧View需要显示的内容绘制到屏幕上,用最简化的方式看ViewRootImpl.performTrav ...

  10. Apache本地配置虚拟域名

    转载+修改 例:虚拟域名为 aaa.com 端口为默认80 index.html所在目录  D:/wamp/www/web 不用解析域名,使用虚假的域名也可以 apache安装完默认是不开启虚拟服务器 ...