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

这篇具有很好参考价值的文章主要介绍了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的实现类文章来源地址https://www.toymoban.com/news/detail-837012.html

public class AidlService extends AsynService {
    private sta

到了这里,关于android aidl进程间通信封装通用实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Binder机制浅谈以及使用Binder进行跨进程通信的俩种方式(AIDL以及直接利用Binder的transact方法实现)

    Binder机制学习 ·为何新增Binder来作为主要的IPC方式 Android也是基于Linux内核,Linux现有的进程通信手段有管道/消息队列/共享内存/套接字/信号量。 既然有现有的IPC方式,为什么重新设计一套Binder机制呢? 主要是出于以上三个方面的考量: 2. binder是什么? 从进程间通信的角度

    2024年02月16日
    浏览(34)
  • Linux知识点 -- 进程间通信(二)

    先在内存中申请空间,然后将这段空间映射到不同进程的地址空间中,这就叫做共享内存; 一般都是映射在进程的堆栈之间的共享区; 共享内存不属于任何一个进程,它属于操作系统; 操作系统对共享内存的管理,是先描述再组织,先通过内核数据结构描述共享内存的属性

    2024年02月14日
    浏览(51)
  • Android Binder——APP中AIDL实现(十九)

            AIDL(Android Interface Definition Language)其实就是对 Binder 通信的一个封装,方便在开发中对 Binder 通信的使用,这里我们就从头开始来看一下 AIDL 通信的创建过程。         通过 Android Studio 的 File -New - AIDL 的方式就会生成对应包名的 aidl 文件。即 aidl 文件要与应用

    2024年04月28日
    浏览(28)
  • Android进程间通信

            在操作系统中,每个进程都有一块独立的内存空间。为了保证程序的的安全性,操作系统都会有一套严格的安全机制来禁止进程间的非法访问,但是,很多情况下进程间也是需要相互通信的 进程间通信(Inter-process communication,简称IPC):是指运行在不同进程中的若

    2023年04月21日
    浏览(31)
  • Python进程间通信常用的几种方式

    1. 队列(Queue) 多个进程使用队列进行数据交换。进程通过队列发送和接收对象。 队列是一个可以存储任意类型数据的数据结构,而且支持多线程操作,因此在Python的多进程编程中,可以利用队列来实现进程间通信。 下面是一个简单的利用队列实现进程间通信的示例代码: 在

    2024年03月26日
    浏览(64)
  • 带你深入了解Android进程间通信

    Android进程通信是指多个进程之间共享信息和完成任务的过程。由于Android系统是基于Linux内核的操作系统,采用了一种面向进程的架构模式,进程间通信是其应用开发中重要的一环,也是保证多进程之间信息交流与任务协作的基石。 Android进程通信主要由两种方式,即:基于

    2024年02月06日
    浏览(44)
  • [Android AIDL] --- AIDL原理简析

    上一篇文章已经讲述了如何在Android studio中搭建基于aidl的cs模型框架,只是用起来了,这次对aidl及cs端如何调用的原理进行简单分析 AIDL 文件可以分为两类。 一类是用来定义接口方法,声明要暴露哪些接口给客户端调用; 一类用来声明实现了 Parcelable 接口的数据类型,以供其

    2024年02月10日
    浏览(44)
  • [Android AIDL] --- AIDL工程搭建

    AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的

    2024年02月10日
    浏览(49)
  • Android进程间大数据通信:LocalSocket

    作者:BennuCTech 说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。 那么我们如何在进程间传输大数据呢? Android中给我们提供了另外一个机制:LocalSocket 它会在本地创建一个socket通道来进行数据传输。 那么它怎么使用? 首先我

    2023年04月11日
    浏览(32)
  • 详谈Android进程间的大数据通信机制:LocalSocket

    说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。 比如我们在之前文章《WebRtc中是如何处理视频数据的?》提到的我们可以得到WebRtc的视频数据,这时候我们如果有一个需求,希望将这些视频数据传送给另外一个APP呢?这个数

    2024年02月01日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包