aidl项目笔记-入门

本文详细介绍了Android中的AIDL(Android Interface Definition Language)的使用步骤,包括创建AIDL接口文件、处理JavaBean的Parcelable实现、服务注册与绑定、以及远程服务调用的注意事项。特别强调了在处理数组属性时,需要写入长度并正确读取以避免异常。通过实例展示了如何在Android应用中实现进程间通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在工程下创建aidl为后缀的文件,格式为
package com.demo.aidl;//包名
import com.demo.aidl.XXVo;//引用了对象的aidl 文件路径.类名  com/demo/aidl/XXVo.aidl
//如果有JavaBean 那么在远程调用服务的代码中也要有相应的javaBean
interface AIDLService{
   byte[] getToken(String name);
}
2.JavaBean的aidl文件的写法
  让JavaBean实现Parcelable   如:public class XXVo implements Parcelable
  XXVo.aidl里面的内容只需要一句话:parcelable XXVo;
   在别处用到了这个aidl文件的时候 注意导包名
3.创建一个服务class AIDLService extends Service通过绑定启动
  public IBinder onBind(Intent intent) {
   return new AIDLServiceImpl();
 }
 在服务里创建final类 实现ISMWService.Stub接口
 class AIDLServiceImpl extends AIDLService.Stub{
 //实现这些方法
 }
 //在androidmainfest.xml文件里面注册服务的时候注意有没有android:process=":remote"的区别
 <!-- android:process=":remote" -->
        <service android:name=".aidl.AIDLService"
                android:process=":remote" >
            <intent-filter>
                <action android:name="com.demo.aidl.AIDLService"/>//通过这个action启动服务
        </intent-filter>
        </service>
4.调用远程的服务
  把相应包名的下文件 aidl文件以及相应的实现了Parcelable的javaBean文件一起拷贝到工程下
  com.demo.aidl
    -XXVo.java
 -XXVo.aidl
 -AIDLService.adil
  通过bindService的时候启动服务
   Intent intent=new Intent();
   intent.setAction("com.demo.aidl.AIDLService");//注意查看提供启动的action
   bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
 
   private ServiceConnection mConnection =new  ServiceConnection() {
  
  @Override
  public void onServiceDisconnected(ComponentName name) {
   //处理当取消连接的时候代码
  }
  
  @Override
  public void onServiceConnected(ComponentName name, IBinder binder) {
   //处理开始连接服务的时候的代码
   
  }
 };
 
 *连接服务的时候注意,远程调用比较耗时,一般会启动一个线程去做。

-------------------------JavaBean实现Parcelable处理数组属性 值得特别注意地方:要写入数组的长度,然后创建相应的长度的数组 如下代码 注释出,(代码摘之源码)

个人觉得,可以把set和get方法去掉,直接把属性设置为public

public final class TransceiveResult implements Parcelable {
    private final boolean mTagLost;
    private final boolean mSuccess;
    private final byte[] mResponseData;

    public TransceiveResult(final boolean success, final boolean tagIsLost,
            final byte[] data) {
        mSuccess = success;
        mTagLost = tagIsLost;
        mResponseData = data;
    }

    public boolean isSuccessful() {
        return mSuccess;
    }

    public boolean isTagLost() {
        return mTagLost;
    }

    public byte[] getResponseData() {
        return mResponseData;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mSuccess ? 1 : 0);
        dest.writeInt(mTagLost ? 1 : 0);
        if (mSuccess) {
            dest.writeInt(mResponseData.length);//实现写明数组的长度
            dest.writeByteArray(mResponseData);
        }
    }

    public static final Parcelable.Creator<TransceiveResult> CREATOR =
            new Parcelable.Creator<TransceiveResult>() {
        @Override
        public TransceiveResult createFromParcel(Parcel in) {
            boolean success = (in.readInt() == 1) ? true : false;
            boolean tagLost = (in.readInt() == 1) ? true : false;
            byte[] responseData;

            if (success) {
                int responseLength = in.readInt();//先读取数组的长度,然后创建相应长度的数组读取内容
                responseData = new byte[responseLength];
                in.readByteArray(responseData);
    // byte[]  responseData=in.creatByteArray();
    //in.readByteArray(responseData);这样写就会报RuntimeException bad array lengths 
       //因为实现没有给出responseData长度
   
            } else {
                responseData = null;
            }
            return new TransceiveResult(success, tagLost, responseData);
        }

        @Override
        public TransceiveResult[] newArray(int size) {
            return new TransceiveResult[size];
        }
    };

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值