Android 中的IPC简单使用

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
@Override
public IBinder onBind(Intent intent) {

    Log.d(TAG, "onBind: " + name);
    //返回对象
    return aidlManager;
}


@Override
public void onCreate() {
    super.onCreate();
    //初始化
    name =  "Android Interface Definition Language";
}

@Override
public 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) {

    }
};

@Override
protected 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值