AIDL传递对象,客户端服务端相互调用,服务端实现

本文详细介绍了如何使用AIDL在Android客户端与服务端间传递对象和添加回调。包括支持的数据类型、自定义对象实现Parcelable接口的方法、定义AIDL接口、回调接口,以及在Service中返回IBinder对象的过程。

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

AIDL 传递对象,客户端服务端相互调用笔记记录

 AIDL 支持传递的数据类型

  • Java八种基本数据类型(int、char、boolean、double、float、byte、long) 但不支持short.
  • String、CharSequence.
  • List和Map.  ( List,Map内的元素必须是AIDL支持 List接收端必须是ArrayList,Map接收端必须是HashMap)
  • 其他AIDL定义的AIDL接口 (需要import)
  • 实现Parcelable的类(需要import) 
1.定义IMyAidlInterface.aidl文件,这里俩个方法分别用于传递对象和添加回调
package com.example;
import com.example.IListener;
import com.example.TestBean;
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void send(String name,IListener iListener);

    TestBean getBean();
}

2.定义TestBean.java
package com.example;

import android.os.Parcel;
import android.os.Parcelable;
public class TestBean implements Parcelable {

    private String name;

    public TestBean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "name:" + name;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
    }

    public void readFromParcel(Parcel dest) {
        name = dest.readString();
    }

    protected TestBean(Parcel in) {
        this.name = in.readString();
    }

    public static final Creator<TestBean> CREATOR = new Creator<TestBean>() {
        @Override
        public TestBean createFromParcel(Parcel source) {
            return new TestBean(source);
        }

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

3.必须在TestBean同目录下定义TestBean.aidl文件,格式如下

// TestBean.aidl
package com.example;

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

parcelable TestBean;
 

4.定义回调接口IListener.aidl文件

// IListener.aidl
package com.example;

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

interface IListener {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
       void onSuccess(int code);
     
}

 

5.build项目就会自动生成IMyAidlInterface.Stub 的IBinder类型文件 

 

6.在ervice的onBind方法中返回 IMyAidlInterface.Stub的IBinder类型对象

public class TestService extends Service {
    private static final String TAG = "TestService";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind");
        return new IMyAidlInterface.Stub() {


            @Override
            public void send(String name, IListener iListener) throws RemoteException {

            }

            @Override
            public TestBean getBean() throws RemoteException {
                return null;
            }
        };
    }

客户端实现,把服务端的文件拷贝到客户端相同的包下,build一下就会生成和服务端一样的IBinder对象

客户端调用IBinder的sender方法,传入IListener 对象,就可以接收来自服务端的回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值