最近又重新看了点IPC的相关知识,以前看过不少Binder的知识,看到c++层思路就很模糊了,回头再看也算是一种学习。

IPC全称为:interprocess communication内部进程间通信,官方地址:http://developer.android.com/intl/zh-cn/guide/components/aidl.html,网上对这一块介绍的资料也着实不少,入门的话还是推荐看老罗的。

鉴于以前也知识看看相关知识,从来也没动手去做过,于是就照着官方文档开始动手创建Demo, 在按照官方文档实现之后,我察觉到有一个需求,官方只是说客户端可以调用远程服务端,那么远程服务端想要调用客户端可不可以呢?

为了尽快实现需求,那我就先将服务启动在本地,也就是说与Service与Activity处于同一进程,进行测试。它的结果是可行的,相关代码如下:

Activity相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends ActionBarActivity implements ServiceConnection, IServiceConnect {public final static String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {...bindService(new Intent("com.example.aidl.RemoteService"), this, BIND_AUTO_CREATE);}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {
<span style="white-space:pre">     </span>Log.e(TAG, "MainActivity onServiceConnected " + name + " - " + service);if (service instanceof ServiceBinder) {ServiceBinder new_name = (ServiceBinder) service;// 获取服务的引用,使服务与Activity建立双向关系RemoteService service2 = new_name.getService();service2.setmServiceConnect(this);}}...@Overridepublic void callback() {// 这种模式只有在同一进程中的服务才可以被使用Log.e(TAG, "MainActivity 被服务端调用");}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(this);}
}
</span>

Service相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class RemoteService extends Service implements Runnable {public final static String TAG = "RemoteService";public IServiceConnect mServiceConnect;...@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "RemoteService onBind");return new ServiceBinder(this);//返回含有服务引用的内部类}public static class ServiceBinder extends Binder {private RemoteService service;public ServiceBinder(RemoteService service) {super();this.service = service;}public RemoteService getService() {return service;}}public void setmServiceConnect(IServiceConnect mServiceConnect) {this.mServiceConnect = mServiceConnect;new Handler().postDelayed(RemoteService.this, 3000);//当建立连接之后启动一个任务}@Overridepublic void run() {if (mServiceConnect != null) {mServiceConnect.callback();//调用Activity的相关方法,验证通信}}}
</span>

上述结果是可以在同一进程的Activity与Service间互相通信的,因为在onServiceConnected中回调的Binder对象则为刚刚Service返回的对象,在Activity中打印的Log如下:

那么跨进程间互相通信可不可以呢?

我们在Service的Manifest文件中给Service添加Process属性,属性值为:remote:

<span style="font-family:Microsoft YaHei;font-size:14px;"><serviceandroid:name="com.example.aidl.RemoteService"android:process=":remote" ><intent-filter><action android:name="com.example.aidl.RemoteService" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></service></span>

好了,这下启动服务之后,它就属于远程服务了,它与Activity不属于同一个进程,在Android中一个进程则是一个虚拟机。

如果我再按照刚才的方法进行测试,服务是启动了,但是Activity收到的Binder对象却是这样的:


这里是说,返回的组件名称为RemoteService,但是返回的Binder对象则为BinderProxy,这个BinderProxy则为RemoteService远程服务在本地的代理,熟悉AIDL的相关信息的人,肯定知道Proxy知道是什么。
那么我们在这里可不可以从Proxy对象中把远程的RemoteService对象拿到呢,我们看一下调试信息:

我们看到在Proxy中的并没有RemoteService的引用,嗯,因为IPC通信,是跨进程的,我们都是通过代理与服务打交道的,所以...

那么回到标题,说说远程服务与本地服务的特点与差异:

其实都是服务,提供的功能一致,只是一个在本地,一个在其它进程,所以,服务与客户端打交道的时候就有了不同,要谨慎对待。

Android远程服务与本地服务的特点以及功能差异相关推荐

  1. 如何给Android应用创建本地服务

    Android系统给应用提供了两种类型的服务:启动型本地服务和绑定型本地服务,这两种服务的详细信息请参考"Android Service开发指南" Android Service开 ...

  2. android应用层服务——binderService,StartService,aidl,本地服务和远程服务

    android中应用层的服务级别与activity差不多.service都是运行在后台的服务,那么它就是不可见的,没有界面的东西.你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改 ...

  3. Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过<service>来声明.可以通过contect.startservice ...

  4. android技术服务,Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...

  5. 【Service】bindService:绑定本地服务和远程服务示例

    绑定本地服务 AndroidManifest.xml中声明服务: <service android:name=".TestLocalService"><inten ...

  6. android学习笔记---40_建立能与访问者进行相互通信的本地服务,后台运行的service

    40_建立能与访问者进行相互通信的本地服务 ------------------------------------------- 1.本地服务:如果服务和访问者在一个进程中那么就叫做本地服务.   ...

  7. Android Binder机制:编写自己的本地服务

    原址 前面几篇博客中系统地介绍了本地服务的注册.检索以及使用过程.这篇博客我们将完成一个属于自己的本地服务:AllenService. 由前面的学习知道,要完成一个自己的本地服务,需要有IAllenS ...

  8. Android——本地服务基础(一)

    本地服务用于应用程序内部,可以实现应用程序自己的一些耗时任务,比如查询升级信息,网络传输,或者在一些场合需要在后台执行,比如播放音乐,并不占用应用程序比如activity所属的线程,而是单开线程后台执 ...

  9. 18_Android中Service的生命周期,远程服务,绑定远程服务,aidl服务调用,综合服务案例,编写一个应用程序调用远程支付宝远程服务场景

    ============================================================================ 服务的生命周期: 一.采用start的方式开始 ...

最新文章

  1. PHP判断变量内容是什么编码
  2. Opencv载入图片并显示的问题
  3. 电赛 | 电源题软件如何准备?
  4. 使用C#像google/zx一样编写脚本
  5. NEXUS S安卓4.0/4.1 【完美】 ROOT教程
  6. seo vue 动态路由_基于vue.jsvue-router的动态更新TDK(SEO优化)
  7. js设置时间在ie中部兼容总是NAN的问题
  8. 确定Oracle URL
  9. Java数组之冒泡排序
  10. Centos 7 安装Redis
  11. 三国志战略版:Daniel_兵无常势分析
  12. 图像处理的相关数学知识
  13. 一般网线的接法(转)
  14. 半导体物理·笔记之④晶体中原子的电子状态——能带
  15. 百度网盘PC端缓存文件夹
  16. 香港计算机专业硕士学制几年,想读香港一年计算机硕士,懂行老哥来指导一下我这个迷茫的five...
  17. 惠普136w耗材贵吗_性价比利器 惠普MFP 136w轻体验
  18. 如何使用COM-Hunter检测持久化COM劫持漏洞
  19. 北方工业大学数据结构考研
  20. 【备战美赛】Lingo与规划问题

热门文章

  1. 稚晖君又整活啦!基于全志F1C200s的超迷你
  2. 长大了,也弄丢了很多东西
  3. RK平台ubuntu安装vbox
  4. python2编码问题解决了吗_Python2编码问题
  5. Linux C目标文件
  6. ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法
  7. Chapter1-4_Speech_Recognition(HMM)
  8. Pytorch 神经网络nn模块
  9. LeetCode 92. 反转链表 II(双指针)
  10. php怎样加速,php 提速