美文网首页
android AIDL在同一工程下的使用方式

android AIDL在同一工程下的使用方式

作者: heheworld | 来源:发表于2020-04-25 23:34 被阅读0次

    AIDL 一直都有听说,主要应用场景是跨进程通信,分客户端和服务端,网上的代码一大堆。最近项目刚好用到,手写下遇到很多问题,记下来。

    需求:同一个工程,一个service使用remote 作为独立进程中的service,需要跟主进程通信,service中负责轮询数据,有特定数据后,传递给主进程。

    但网上demo多是写Client,Server两个工程,也都是Client主动发起的一次性请求,只能自己倒腾了。不写不知道,一写发现好多地方都卡壳了,记下来

    • Q:只有一个工程,但需要通过aidl实现跨进程,怎么弄?
      A: 正常操作,在/src/main目录下,建立跟java同级的aidl文件夹,新建对应的aidl文件(包名跟java下的包名一致,记得是自动建立的,如果不是,就手动建下)

      截图如下: a.png
    • Q:AIDL 内需引用到自定义的类和接口,怎么办?
      A: 正常写AIDL文件,但自定义类需要实现parcelable接口(parcelable类型),在引用文件内需手动import下该自定义类。
      如下IMyAidlInterface 使用到了 Student类,则对应的AIDL应该这么写:

    // Student.aidl
    package com.nico.test4aidl;
    // Declare any non-default types here with import statements
    parcelable Student;  //Student.aidl 表示是个parcelable 类型的对象,供其他AIDL接口使用
    
    // IMyAidlInterface.aidl
    package com.nico.test4aidl;
    
    // Declare any non-default types here with import statements
    import com.nico.test4aidl.Student;  //这里手动引入Student
    import com.nico.test4aidl.IMyCallback;
    interface IMyAidlInterface {
    Student getStudent();
    void changeData();
    void registerCallback(IMyCallback callback);
    void unRegisterCallback();
    }
    

    如果用到其他的接口,(我这边需求是客户端通过aidl在服务端注册,服务端在处理,如果有触发会通知客户端,于是通过aidl
    可以这么来写)

    // IMyCallback.aidl
    package com.nico.test4aidl;
    // Declare any non-default types here with import statements
    interface IMyCallback {
        /**
         * Demonstrates some basic types that you can use as parameters
         * and return values in AIDL.
         */
        void callback(boolean flag);  //客户端给服务端的回调方法
    }
    
    • Q: 怎么启动?
      A:正常bindservice,startservice都可以,Intent 是使用setComponent来指定对应的service。服务端service在配置文件里加上:remote。

    大概就这么多了。平时还是需要多写代码,纸上得来终觉浅。

    最后,遇到一个问题,在服务端的service内,aidl接口方法想调用service内的方法,kotlin来写总是提示不对,java写就没问题,对kotlin不熟悉,没有深入去研究。

    相关文章

      网友评论

          本文标题:android AIDL在同一工程下的使用方式

          本文链接:https://www.haomeiwen.com/subject/utmcwhtx.html