Android 进程间通信-Intent、Messenger、AIDL

Android 进程间通信-Intent、Messenger、AIDL

​Android进程间通信(IPC,Inter-Process Communication)底层采用的是 Binder 机制,具体到应用层有网友根据安卓四大组件将进程间通信方式分为对应的四种方式 Activity, Broadcast, ContentProvider, Service。Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回);Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service可通过 AIDL(Android Interface Definition Language) 实现跨进程通信。

本文根据实现 IPC 的具体手段,分为以下四种方式:

  • 使用 Intent 通信
  • 持久化数据通信(ContentProvider,本地文件等)
  • 使用信使(Messenger)通信
  • 使用 AIDL 通信

关于示例代码

下面提到的示例代码可在我的Github的BlogDemo库中的ipc-demo目录下的示例工程获取。工程是用 AndroidStudion 创建,源代码位置 BlogDemo/ipc-demo/[工程名]/src/main/java/

使用 Intent 通信

Intent 是安卓的一种消息传递机制,可用于 Activity/Service 交互,传送广播(Broadcast)事件到 BroadcastReceiver。当交互的 Activity/Service 在不同进程内,此时 Intent 的传递便是跨进程的,。具体使用方法有:

  • 通过Context.startActivity() or Activity.startActivityForResult() 启动一个Activity;
  • 通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;
  • 通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()) 发给broadcast receivers。

关于 Intent 的详细内容可参考文章 Android Activity和Intent机制学习笔记

通过 Intent.putExtra() 可将基本类型数据, Bundle及可序列化的对象存入 Intent 中在进程间传递。其中基本类型数据包括 double,float,byte,short,int,long,CharSequence(String, CharBuffer等的父类),char,boolean,及其对应的数组。放入 extra 的对象需要实现序列化(Bundle也实现了Parcelable)。对象的序列化有两各方式:

  • 实现Java的序列化接口Serializable
  • 实现Android特有的序列化接口Parcelable

Serializable 使用简单只需要注明实现即可不需要实现额外的方法,可保存对象的属性到本地文件、数据库、网络流以方便数据传输。Parcelable 相比 Serializable 效率更高更适合移动端序列化数据传递,需要手动将类的变量打包并实现必要的方法,且实现 Parcelable 的类的变量如果是对象亦需要实现了序列化。Parcelable 序列化是存储在内存的,不能适用用保存对象到本地、网络流、数据库。具体使用方法可参考文章android Activity之间数据传递 Parcelable和Serializable接口的使用 及 Android文档 Parcelable

持久化数据通信

一种间接实现安卓进程间通信的方法是持久化数据,如使用数据库,ContentProvider,本地文件,SharePreference等,将数据存储在两个程序皆可获取的地方,可以间接达到程序间通信,并不能算是真正的IPC。这种方法一般效率较低,缺乏主动通知能力,一般用于程序间的简单数据交互。

使用信使(Messenger)通信

Messenger 在进程间通信的方式和 Hanlder-Message 类似,Hanlder在A进程中,B进程持有A的 Messenger 通过此发送 Message 到A实现进程间通信。Messenger 是对 Binder 的简单包装。相对于 AIDL 方式,Messenger 是将请求放入消息队列中然后逐条取出处理的,而纯 AIDL 接口可以将多条请求并发传递到服务端(多线程处理请求)。如果不需要并发处理请求时,采用 Messenger 是更好的选择,这种方法更为简单易于实现,不需要额外写 AIDL,不需要考虑多线程,对于 Handler-Message 机制更为广大安卓开发者熟悉不易出错。

使用 Messenger 一般步骤如下:

  • 服务端的 Service 实现一个 Handler 来处理请求。
  • 用该 Handler 创建一个 Messenger。
  • 在服务端返回客户端的方法 onBind() 中返回 Messenger.getBinder() 创建的 IBinder。
  • 客户端通过得到的 IBinder 初始化一个 Messenger(引用了服务端的 Handler),此时客户端可通过该 Messenger 发送消息到服务端。

从上面的步骤我们知道如何将服务端的信鸽传送到客户端使客户端可以发送请求到服务端,那么服务端如何将请求送达客户端呢?当客户端获得服务端的 Messenger 后,可以很轻松的将自己的 Messenger 通过 Message 发送到服务端,使服务端可以发送请求到客户端。赋值 Message.replyTo 为客户端自己的 Messenger ,再将此 Message 发送到服务端即可。

下面是使用简单的 Demo 演示了使用 Messenger 如何跨进程通信,服务端为一个 Service,客户端为Activity。通过指定 ServerService 的 android:process 属性使其在另一个进程。
服务端进程代码如下:

public class ServerService extends Service {
   

    static final String TAG = "halflike";

    public static final int MSG_BIND_MESSENGER = 0;
    public 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 中的进程间通信IPC)有以下几种方式: 1. Binder:是 Android 系统中最常用的 IPC 机制,它是一种高效、稳定、安全的进程通信方式,常用于 Service 和 Activity 之间通信。 2. Messenger:基于 Binder 实现的进程通信方式,可以向其他进程发送 Message。 3. AIDL:也是基于 Binder 实现的进程通信方式,使用 AIDL 定义接口,然后在客户端和服务端之间传递数据。 4. ContentProvider:提供了一种在多个应用程序之间共享数据的方式,其他应用程序可以通过 ContentResolver 访问 ContentProvider 中的数据。 5. Socket:通过套接字进行进程间通信,常用于网络通信和本地进程通信。 6. BroadcastReceiver:通过 Intent 进行进程通信,可以在不同的应用程序之间传递消息。 以上是 Android 中常见的进程间通信方式,不同的场景可以选择不同的方式来实现进程间通信。 ### 回答2: Android进程间通信的方式有以下几种: 1. 使用Bundle:Bundle是一种存储数据的容器,在Android中可以用于进程间通信。通过将数据存储在Bundle对象中,然后在不同的进程间传递Bundle对象来实现通信。 2. 使用IntentIntent是一种在Android中用于传递消息和数据的对象。通过在不同的进程间发送Intent来实现进程间通信。 3. 使用AIDLAndroid Interface Definition Language):AIDL是一种用于定义进程接口的语言。通过在服务端定义AIDL接口,然后在客户端通过AIDL来调用服务端提供的接口,实现进程间通信。 4. 使用Messenger:Messenger是一种轻量级的进程间通信机制,它基于Handler和Binder机制。通过在不同的进程间传递Messenger对象,实现进程间通信。 5. 使用ContentProvider:ContentProvider是一种用于在不同应用程序之间共享数据的组件。通过在ContentProvider中实现数据的读写操作,其他应用程序可以通过ContentResolver来访问和共享这些数据,实现进程间通信。 通过以上几种方式,Android应用程序可以实现不同进程间的通信,以满足不同的需求和场景。 ### 回答3: Android进程间通信有以下几种方式: 1. Binder机制:Binder是Android中一种高效的进程间通信机制,它是基于C/S架构的,通过将服务以Binder驱动的方式注册到系统Service Manager中,实现一对多或多对多的进程间通信。 2. AIDLAndroid Interface Definition Language):AIDLAndroid进程间通信接口定义语言,通过定义接口及数据类型,在服务端和客户端之间进行通信。AIDL框架提供了支持程序的IPCInter-Process Communication)功能。 3. Messenger:Messenger是基于AIDL封装的一种进程间通信方式。通过Messenger可以实现进程间的消息传递,但是一次只能传递一个消息,不能进行数据的交互操作。 4. ContentProvider:ContentProvider是Android提供的一种进程间通信方式,它通过对外共享数据的方式实现进程间的数据交换。ContentProvider可以对外提供访问数据库等共享数据的接口,并通过URI进行数据的增删改查操作。 5. Broadcast Receiver:广播接收器是一种全局的事件通知机制,可以在不同进程之间进行消息的发送和接收。通过广播接收器可以实现简单的进程间通信,但是通信的内容只能是Intent对象。 6. Socket:Socket是一种传统的网络通信方式,通过网络套接字进行进程间通信。在Android中,可以使用Socket实现不同进程之间的通信,但是相对于其他方式,Socket的效率较低。 以上是常见的Android进程间通信的方式,根据具体的需求和场景选择适合的方式可以有效实现进程间的数据交换和消息传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值