Android AIDL案例实践

本文详细介绍了Android AIDL的使用,包括简单传值和传递对象的案例。AIDL用于实现多应用进程间的通信,支持基本数据类型、String、CharSequence、List、Map以及Parcelable。在简单传值案例中,涉及ServiceAPP和ClientAPP的设置,以及如何建立服务并获取返回数据。在传对象案例中,重点讲解了对象序列化为Parcelable,以及AIDL中in、out、inout参数的区别和使用。
摘要由CSDN通过智能技术生成

AIDL :Android Interface Define Language(Android接口定义语言)

主要用于多应用进程间通信

通过Android来进行数据通信

默认支持的数据类型:

1、基本数据类型(int ,long, boolean, double, float, byte char ) <不支持short>

2、String,CharSequence

3、List,Map

4、Parcelable

案例–简单传值:

​ 客户端与服务端通讯,处理后返回客户端数据

​ 实现原理:

​ 1、需要一个ServiceAPP、一个ClientAPP;

​ 2、两个app都需要创建aidl,两个APP中相同的文件位置、相同包名下的.aidl文件

​ 3、ServiceAPP中需要创建一个Service

​ 4、ClientAPP中需要绑定服务,并获取连接返回参数

ServiceApp:

1、AidlService.java

2、mian->aidl->包名->IMyAidlInterface.aidl

源代码:

//记得注册Service
public class AidlService extends Service {
    public AidlService() {
    }

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

    private IBinder iBinder = new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.e("chenxh","收到遠程數據"+num1+" "+num2);
            return num1+num2+num2;
        }
    };

}
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

    int add(int num1,int num2);

}

ClientAPP:

1、需要将ServiceAPP下的aidl整个复制到同样目录下

2、需要在MainActivity做一些处理,绑定服务,并开启服务回调

源代码:

class MainActivity : AppCompatActivity() {
   
    private var myAidl: IMyAidlInterface? = null
    private var intentService: Intent? = null


    private val conn = object : ServiceConnection {
   

        //绑定服务,回调onBind()方法
        @SuppressLint("WrongConstant")
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
   
            myAidl = IMyAidlInterface.Stub.asInterface(service)
            Toast.makeText(this@MainActivity, myAidl!!.add(4, 5).toString(), Toast.LENGTH_LONG).show()

        }

        override fun onServiceDisconnected(name: ComponentName) {
   
            myAidl = null
        }

    }


    @SuppressLint("WrongConstant")
    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initViewControl()
        intentService = Intent()
        intentService!!.setComponent(ComponentName("com.xx.xx.umsaidldemo", "com.xx.xx.umsaidldemo.AidlService"))
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值