Android进程间通信

简介

IPC(Inter-Process Communication,进程间通信)
Android 平台下,各个进程都占有一块自己独有的内存空间,各个进程在通常情况下只能访问自己独有的内存空间,而不能对别的进程的内存空间进行访问。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。

AIDL

AIDL(Android Interface Definition Language,即Android接口定义语言)

注意:只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。如果您无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果您想执行 IPC,但不需要处理多线程,请使用 Messenger 来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务。

默认情况下,AIDL 支持下列数据类型:

  • 基本数据类型(如int、float等)
  • String
  • CharSequence
  • List
    List 中的所有元素必须是以上列表中支持的数据类型,或者您所声明的由 AIDL 生成的其他接口或 Parcelable 类型。您可选择将 List 用作“泛型”类(例如,List)。尽管生成的方法旨在使用 List 接口,但另一方实际接收的具体类始终是 ArrayList。
  • Map
    Map 中的所有元素必须是以上列表中支持的数据类型,或者您所声明的由 AIDL 生成的其他接口或 Parcelable 类型。不支持泛型 Map(如 Map 形式的 Map)。尽管生成的方法旨在使用 Map 接口,但另一方实际接收的具体类始终是 HashMap。

即使您在与接口相同的包内定义上方未列出的附加类型,亦须为其各自加入一条 import 语句。

AIDL步骤:

  1. 创建 .aidl 文件。点击完成按钮后,会在 main 目录下自动生成 aidl 的目录,该目录下的包名和 java 目录下的包名保持一致,包下即是新建的 .aidl 文件,文件内容如下所示:
// IRemoteService.aidl
package cn.lwd.src.learn.aidl;

// Declare any non-default types here with import statements

interface IRemoteService {
    String hello();
}
  1. 实现接口。当您构建应用时,Android SDK 工具会生成以 .aidl 文件命名的 .java 接口文件。生成的接口包含一个名为 Stub 的子类(例如,IRemoteService.Stub),该子类是其父接口的抽象实现,并且会声明 .aidl 文件中的所有方法。
/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package cn.lwd.src.learn.aidl;
// Declare any non-default types here with import statements

public interface IRemoteService extends android.os.IInterface {

/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements cn.lwd.src.learn.aidl.IRemoteService {
...
}

public java.lang.String hello() throws android.os.RemoteException;
}
private final IRemoteService.Stub binder = new IRemoteService.Stub() {
    public int getPid() {
        return Process.myPid();
    }
    
    public void basicTypes(int anInt, long aLong, boolean aBoolean,
        float aFloat, double aDouble, String aString) {
        // Does nothing
    }
};
  1. 向客户端公开接口
public class RemoteService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Return the interface
        return binder;
    }

    private final IRemoteService.Stub binder = new IRemoteService.Stub() {
        public int getPid(){
            return Process.myPid();
        }
        public void basicTypes(int anInt, long aLong, boolean aBoolean,
            float aFloat, double aDouble, String aString) {
            // Does nothing
        }
    };
}

参考

  • 安卓开发者

你可能感兴趣的:(android)