- IPC
IPC是Inter-Process Communication的缩写,是进程间通信或者跨进程通信的意思,在Android中每个app在Linux内核中都属于一个独立的进程,进程之间是独立的,当然内存也是独立的,但是我们有时还是有需求让我们的两个App进行数据共享,我们就来看看Android中我们进行进程间的通讯的。最low的方法就是在sdcard文件存储进行共享
- Android进程通信的办法
我们先列举出来,然后再进行详细介绍。方法:AIDL、广播接收者、Socket、ContentProvider、sd卡文件共享(最low),下面我们就介绍其如何使用,主要讲解AIDL跨进程通信,也是Google提倡的
- AIDL
AIDL(Android Interface definition language),这是Android进程内部通讯的语言,aidl文件只有先编译后生成class文件才能被我们的Java代码调用。从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager,等等)和相应ManagerService的桥梁,所以说Binder才是跨进程通讯的方式,而AIDL的实现方式就是Binder,使用AIDL,我们很熟悉Stub,其实Stub就是AIDL编译后的一个Java抽象类,这个类集成了android.os.Binder,我们新建MyListener.aidl文件,再看看编译成Java class文件后反编译的Java的文件
MyListener.aidl
// MyListener.aidl
package com.wxx.service;
interface MyListener {
void sum(String sum);
}
MyListener.java
Client客户端使用代码
private val connection = object : ServiceConnection{
override fun onServiceDisconnected(name: ComponentName?) {
myAidl = null
}
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
myAidl = MyAidl.Stub.asInterface(service)
myAidl!!.addListener(object : MyListener.Stub(){
override fun sum(sum: String?) {
txt_result.text = "另一个进程计算出来的结果:$sum"
}
})
}
}
其实使用就是这么简单,跟Activity和Service直接的通讯差不多,AIDL里为了安全起见,有in、out、inout三个关键字,in代表只允许进不允许出,out代表只允许出不允许进,inout代表可以双向通信
项目地址:Git仓库,该项目是在进程A输入两个数,进程B计算后并返回给进程A的例子,仓库里有预览图、源码、apk
- Socket
Socket都可以跨服务器通讯,当然跨进行更是so easy,socket原理就是本机开启端口后,咋们直接通过端口通讯,自己定义数据协议就可以,所以说他是无所不能的
- 广播接收者
这个就是通过广播的形式,两个进程协商广播的action,对于Android开发者是很容易理解的
- ContentProvider
内容提供者,好比相册,每个app都可以获取相册的数据,这种方式相对繁琐
- SD卡文件共享
在sd卡文件夹下新建文件,多个app都可以访问,呵呵,最简单但是是最low的方法