当前位置: 首页 > news >正文

android aidl进程间通信封装通用实现

接上一篇的分析,今天继续

aidl复杂流程封装-CSDN博客

今天的任务就是将代码梳理下放进来


1 项目gradle配置:


   需要将对应的代码放到各自的目录下,这里仅贴下关键内容,细节可以下载代码慢慢看
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['assets']
        }

        local {
            java.srcDirs = ['src/local/java']
        }

        remote {
            java.srcDirs = ['src/remote/java']
        }
    }

    flavorDimensions "sdk"
    productFlavors {
        local {
            dimension "sdk"
        }

        remote {
            dimension "sdk"
        }
    }


2 aidl相关文件


  1 客户端的回调接口:


interface ICallback {
    void received(String params, in Bundle bundle);
}

 2 aidl通信接口:
interface IServiceBinder {int register(int version, String caller, ICallback callback);void unregister(String caller, ICallback callback);String received(String params, in Bundle bundle);
}

3 服务端(本地)代码


  先看下对服务类的封装:增加服务端通知消息的入栈异步处理,防止服务端卡顿
  (由于看板信息,播报信息,路况信息等数据频繁,需放入单独线程或线程池处理)

public abstract class AsynService extends Service {protected static final String TAG = "AidlControl-AsynService";protected WorkThread worker;public void onCreate() {super.onCreate();Log.e(TAG, "onCreate: ");if (this.worker == null || !this.worker.isRunning()) {this.worker = new WorkThread();this.worker.start();}}public void onDestroy() {super.onDestroy();Log.e(TAG, "onDestroy: ");if (this.worker != null && this.worker.isRunning()) {this.worker.interrupt();this.worker = null;}}protected String getRequestAuthor(String params) {String requestAuthor = null;try {JSONObject jsonObject = new JSONObject(params);if (jsonObject.has(SDKConstants.KEY_CLIENT_REQUEST_AUTHOR)) {requestAuthor = jsonObject.optString(SDKConstants.KEY_CLIENT_REQUEST_AUTHOR);}} catch (JSONException e) {Log.e(TAG, "getRequestAuthor: ", e);}return requestAuthor;}protected void offerReq(JsonProtocolManager.Message message) {this.worker.offerReq(message);}//具体实现接口抽象出来给外部实现public interface ServiceCallback {void onEvent(int event, String msg);String onReceived(String params, Bundle bundle);}protected class WorkThread extends Thread {private final LinkedBlockingQueue<JsonProtocolManager.Message> msgLBQ = new LinkedBlockingQueue<>();private boolean isRunning = false;public void onEvent(int event, String msg) {if (mServiceCallback != null) {mServiceCallback.onEvent(event, msg);}}public void offerReq(JsonProtocolManager.Message message) {this.msgLBQ.offer(message);}public void run() {this.isRunning = true;while (this.isRunning) {Log.e(TAG, "running: ");try {JsonProtocolManager.Message msg = this.msgLBQ.take();if(!AsynService.this.send(msg)){//msgLBQ.offer(msg);}} catch (Exception e) {e.printStackTrace();}}Log.e(TAG, "running over: ");}boolean isRunning() {return this.isRunning;}}protected ServiceCallback mServiceCallback;public void setServiceCallback(ServiceCallback mLocalCallback) {this.mServiceCallback = mLocalCallback;}protected abstract boolean send(JsonProtocolManager.Message message);
}

  接下来就是具体service的实现类

public class AidlService extends AsynService {private sta

相关文章:

  • k8s实用命令
  • 算法之力扣数青蛙
  • C语言---指针进阶
  • 世界顶级名校计算机专业,都在用哪些书当教材?
  • Java安全 URLDNS链分析
  • 函数——递归3(c++)
  • ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识
  • 设计模式之:状态模式(State Pattern)
  • R语言【base】——nrow(),ncol(),NCOL(),NROW():返回数组的行数/列数
  • 如何解决缓存和数据库的数据不一致问题
  • Spring Boot 笔记 012 创建接口_添加文章分类
  • VueCLI核心知识3:全局事件总线、消息订阅与发布
  • pytorch神经网络入门代码
  • 最优字符串分隔符:零宽度空格和字符
  • 从宏观到微观——泽攸科技ZEM系列台式扫描电子显微镜在岩石分析中的应用
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【node学习】协程
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 78. Subsets
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • flutter的key在widget list的作用以及必要性
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java 网络编程(2):UDP 的使用
  • JavaScript类型识别
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP CLI应用的调试原理
  • Python利用正则抓取网页内容保存到本地
  • SAP云平台里Global Account和Sub Account的关系
  • Vue小说阅读器(仿追书神器)
  • Wamp集成环境 添加PHP的新版本
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 创建一种深思熟虑的文化
  • 从PHP迁移至Golang - 基础篇
  • 高性能JavaScript阅读简记(三)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 使用parted解决大于2T的磁盘分区
  • 王永庆:技术创新改变教育未来
  • 湖北分布式智能数据采集方法有哪些?
  • #每日一题合集#牛客JZ23-JZ33
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (C语言)逆序输出字符串
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (javascript)再说document.body.scrollTop的使用问题
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (zhuan) 一些RL的文献(及笔记)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (规划)24届春招和25届暑假实习路线准备规划
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)Linux网络编程入门