android aidl 用法实现

6 篇文章 0 订阅
1 篇文章 0 订阅
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信


数据提供端
1 编写aidl中传输对象的数据结构(Dog类)
编写aidl文件Dog.aidl
parcelable Dog;
编写java文件Dog.java 实现 Parcelable接口
package com.example.aidl;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
public class Dog implements Parcelable {
    private String name;
    private int age;
    private boolean isMale = false;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isMale() {
        return isMale;
    }
    public void setMale(boolean isMale) {
        this.isMale = isMale;
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        boolean[] bs = new boolean[2];
        bs[0] = isMale;//boolean类型不能直接写入序列化,借助boolean数组
        dest.writeBooleanArray(bs);
    }
    public static final Parcelable.Creator<Dog> CREATOR = new Creator() {


        public Dog createFromParcel(Parcel source) {
            // 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
            Dog p = new Dog();
            p.setName(source.readString());//读写序列化顺序必须和写入顺序一致
            p.setAge(source.readInt());
            boolean[] val = new boolean[2];
            source.readBooleanArray(val);
            if (val != null)
                p.setMale(val[0]);
            return p;
        }
        @Override
        public Dog[] newArray(int size) {
            return new Dog[size];
        }
    };
}


2 编写service.aidl 文件
package com.example.aidl;
import com.example.aidl.Dog;
interface IMyService{
    String getValue();
    Dog getDog();
}


3 编写service.java文件
package com.example.aidl;


import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.example.aidl.Dog;


public class MyService extends Service {
    public class MyServiceImpl extends IMyService.Stub {


        @Override
        public String getValue() throws RemoteException {
            try {
                // 虚拟耗时操作,测试客户端需要启动线程访问该接口
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "哈哈哈";
        }


        @Override
        public Dog getDog() throws RemoteException {
            Dog dog = new Dog();
            dog.setName("Tom");
            dog.setAge(2);
            dog.setMale(true);
            return dog;
        }
    }


    @Override
    public IBinder onBind(Intent intent) {
        return new MyServiceImpl();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
}
3 在manifest文件中注册service文件
<service
            android:name="com.example.aidl.MyService"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.example.aidl.IMyService" />
            </intent-filter>
        </service>






客户端
1 拷贝数据提供端gen文件夹中生成的aidl文件夹和Dog类
2 主界面使用aidl获取数据
 private IMyService myService = null;
 ServiceConnection serviceConnection = new ServiceConnection() {


        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("LXL", "disConnected");
        }


        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = IMyService.Stub.asInterface(service);
            Log.e("LXL", "connected");
        }
    };


    bindService(new Intent("com.example.aidl.IMyService"),
                    serviceConnection, Context.BIND_AUTO_CREATE);
    //注: com.example.aidl.IMyService 是数据提供端在manifest中注册service的action参数
    msg = myService.getValue();//这个接口是耗时操作需要放入线程
    dog = myService.getDog();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值