IPC(Inter-Process Conmunication) 进程间通讯

在同一进程中,各个组件进行通信是十分方便的,普通的函数调用就可以解决;但是,对于处于不同进程中的组件来说,要进行通信,就需要用到Android的IPC机制了。

IBinder/Binder是Android远程对象的基本接口,它是Android用于提高IPC通信而设计的一套轻量级远程调用机制的核心部分。该接口描述了与一个远程对象进行通信的抽象协议。

AIDL: Android interface definition language Android接口定义语言:专门用来解决进程之间的通信。

  1. 远程服务:运行在其他应用里面的服务
  2. 本地服务:运行在自己应用里面的服务
  3. 进程间通信 IPC
  4. aidl支持的类型:基本数据类型,String,CharSequence, List, Map, 自定义(实现Parcelable接口的)对象

AIDL 实现步骤:

  1. 先把Iservice.java文件变为aidl文件,不要修饰符
  2. 会自动生成一个Stub类,实现IPC
  3. 我们定义的MyBinder类直接实现Stub类,Stub是继承Binder实现IService接口
  4. 想要保证应用程序的aidl文件是同一个,要求aidl文件所在的包名相同
  5. 通过Stub类的静态方法Stub.asinterface(IBinder obj)获取IService对象

实现操作:

Remote服务器端:

记得在清单文件中注册服务,并设置action动作,以便在另一个应用中连接通信。

// IService.aidl
package com.example.lenovo.remoteservice; // Declare any non-default types here with import statements interface IService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/ int callAddMethod(int a, int b);
}
public class MyRemoteService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
} @Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
} @Override
public void onDestroy() {
super.onDestroy();
} public int addMethod(int a, int b){
return a+b;
} class MyBinder extends IService.Stub{
@Override
public int callAddMethod(int a, int b) throws RemoteException {
return addMethod(a, b);
}
}
}

Local客服端:

public class MainActivity extends Activity {
private Button button; IService iService;
private MyConn conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
conn = new MyConn();
Intent intent = new Intent();
intent.setAction("com.example.lenovo.remoteservice");
bindService(intent, conn, BIND_AUTO_CREATE); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int res = iService.callAddMethod(3, 4); //远程服务计算3+4的运算
Toast.makeText(MainActivity.this, "由远程方法计算的结果为: 3+4=" + res, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
} private class MyConn implements ServiceConnection{ @Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = IService.Stub.asInterface(service);
} @Override
public void onServiceDisconnected(ComponentName name) { }
} @Override
protected void onStop() {
super.onStop();
unbindService(conn);
}
}

aidl的应用场景:支付宝

Messenger:

实现IPC通信,底层也是使用了AIDL方式。和AIDL方式不同的是,Messenger方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的。支持并发处理。因此,我们使用AIDL处理的时候需要注意线程安全的问题。很多情况下,我们应用中不需要并发处理。因此,我们通常只需要使用Messenger方式。

实现思想:

在进程A中创建一个Message, 将这个Message对象通过Messenger.send(message)方法传递到进程B, send(message)方法是不可以对Message对象直接传递,需要使用Parcel对象进行编集;再将Parcelable对象传到进程B中,然后解集。再把Message对象添加到消息队列中,Handler会对其进行处理。

 实现步骤:

  1. 创建一个服务类继承Service
  2. 在服务中定义一个Handler对象
  3. 再声明定义一个Messenger对象: private Messenger messenger = new Messenger(handler);
  4. 在onBind()方法中返回一个IBinder对象: return messenger.getBinder();
  5. 在本地客户端中通过绑定服务获取返回的IBinder对象,进行send(message)操作
  6. 在远程服务端对发送的消息进行相应的处理

Android之IPC(aidl)的更多相关文章

  1. 【Android】进程间通信IPC——AIDL

    AIDL官网定义AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Androi ...

  2. Android之IPC机制

    Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...

  3. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

  4. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  5. [置顶] 深入理解android之IPC机制与Binder框架

    [android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...

  6. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

  7. Android DevArt6:Android中IPC的六种方式

    Android中IPC的六种方式 1.使用Bundle 最简单的进程间通信方式:Intent + Bundle: 支持三大组件:Activity.Service.BroadcastReceiver : ...

  8. (转载)Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  9. (转载)Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...

随机推荐

  1. 传统平面广告已OUT出局,VR全景异军突起——VR全景智慧城市

    VR,近两年异军突起的"黑科技".从1935年斯坦利·温鲍姆首次在小说中描述VR眼镜,到如今PC头盔.VR分体机以及VR一体机的相继问世,VR自身已从虚拟走向现实.而当硬件迭代逐步 ...

  2. python 2.7中urllib 2 与python 3.5中 urllib的区别。

    python 3.x中urllib库和urilib2库合并成了urllib库. 其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Reque ...

  3. SQL Server AG集群启动不起来的临时自救大招

    SQL Server AG集群启动不起来的临时自救大招 背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导 ...

  4. springmvc 添加@ResponseBody

    1.添加ResponseBody之后的话 返回字符串的时候 就是一个字符串. @RequestMapping(value = "/{bookId}/detail.do",metho ...

  5. 利用npm安装/删除/发布/更新/撤销发布包 --社会我npm哥,好用话不多

      一.什么是npm? npm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率   1.从社区的角度:把针对某一特定 ...

  6. Spring学习(22)--- AOP之Advice应用(下)

    (六)Advice parameters(advice带参数的情况) 例子: 修改MyAspect(添加around_init方法): package com.aop.schema; import o ...

  7. CentOS 7 for ARM 安装一键Lnmp失败

    背景 前面把树莓派装上了CentOS 7,趁着国庆放假回来赶紧把服务端环境搭起来,为了方便就准备用一键lnmp快速部署一个,结果死活安装不成功... 报错 按照以往的经验进行安装,在我的小树莓派上安装 ...

  8. 常用linux小工具介绍

    1.ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM. ctags 最先是 ...

  9. iOS-swift-协议和拓展

    1 协议(protocol) 使用关键字 protocol 创建协议. protocol ExampleProtocol { var simpleDescription: String { get } ...

  10. Centos常用命令及解释

    ps -ef|grep java ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. grep命 ...