Android 中的IPC简单使用

来源:互联网 发布:电脑抽奖软件下载 编辑:程序博客网 时间:2024/06/02 05:58

AIDL

Android Interface Definition Language  //安卓接口定义语言

语法

  • 文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。
  • 数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包, 就算目标文件与当前正在编写的 .aidl 文件在同一个包下 ——在 Java 中,这种情况是不需要导包的。

默认支持的数据类型包括:

  • Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
  • String 类型。
  • CharSequence类型。
  • List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。
  • Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的。
  • 定向tag:AIDL中的定向 tag 表示了在跨进程通信中数据的流向。用于非默认支持的数据类型,有三种 in代表数据可以从客户端流向服务端 ,out则相反,inout代表支持双向流动

支持自定义类的数据类型 ,但是必须实现Parcelable接口

 /** * 参数是一个Parcel,用它来存储与传输数据 * @param dest */ //**这样数据就能支持out流向了**public void readFromParcel(Parcel dest) {    //注意,此处的读值顺序应当是和writeToParcel()方法中一致的    name = dest.readString();    price = dest.readInt();}

使用AIDL实现跨进程通信

1.创建AIDL文件,一般所有AIDL用到的类要在同一个包里这样移植也比较方便

interface AIDLManager {String getName();void setName(String name);}

==自定义类一定要导包==

如果不放在一起可以使用以下Gradle代码实现读取同包里的文件

sourceSets {main { java.srcDirs = ['src/main/java', 'src/main/aidl']}}

2.编写服务端代码

public class MyService extends Service {private static final String TAG = "MainActivity";private String name;//重写方法AIDLManager.Stub bookManager = new AIDLManager.Stub() {    @Override    public String getName() throws RemoteException {        return name;    }    @Override    public void setName(String name) throws RemoteException {        MyService.this.name = name;    }};@Nullable@Overridepublic IBinder onBind(Intent intent) {    Log.d(TAG, "onBind: " + name);    //返回对象    return aidlManager;}@Overridepublic void onCreate() {    super.onCreate();    //初始化    name =  "Android Interface Definition Language";}@Overridepublic void onDestroy() {    super.onDestroy();}

}

3.客户端代码

AIDLManager.Stub aidlManager;ServiceConnection serviceConn = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        aidlManager = (AIDLManager.Stub)        AIDLManager.Stub.asInterface(service);        try {            String name1 = aidlManager.getName();            aidlManager.setName("sfsfsf");            Log.d(TAG, "onServiceConnected: " + name1);            Toast.makeText(MainActivity.this, "" + name1, Toast.LENGTH_SHORT).show();        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    public void onServiceDisconnected(ComponentName name) {    }};@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Intent intent = new Intent();    intent.setAction("cn.gas.testaidl.aidl");    intent.setPackage("cn.gas.testaidl");    bindService(intent, serviceConn, BIND_AUTO_CREATE);}
0 0
原创粉丝点击