Android | IPC进程间通信 之 AIDL实践

简介: Android | IPC进程间通信 之 AIDL实践

项目GitHub地址

Service基础回顾

  • **主要要用到的就是启动Service和绑定Service两种方式,

大概的流程这里就不赘述了,
可以参考一下这篇博文:学习笔记| AS入门(十) 组件篇之Service**

  • 这里主要强调几点:

    • **startServicebindService都可以启动服务,

但是其影响Service的生命周期不同,
而且bindService可以是Activity能同Service交互通信,
监控Service任务的情况;**

- **`startService`和`bindService`两种方式都调用之后,

必须同时使用stopServiceunbindService
才能销毁服务;**

- **换句话说,

startService被调用之后,如果没有调用stopService
则无论调用多少次bindServiceunbindService
都无法销毁服务;**


IPC实战

跨进程启动服务

**现在我们看一下这两个实战项目,
一个[AIDLTest项目](),
还有一个[AIDLDemo项目](),

AIDLTest项目可以
单独用于测试同一个进程内的Service基础运作,

当然这里咱们要表演一个IPC(进程间通信)过程,
即,
AIDLDemo项目中,
访问到AIDLTest项目MyService
【即跨APP、跨进程通信访问】

下面是AIDLTest项目AndroidManifest
我们给MyService一个action标签
以及记下来AIDLTest项目的包名,待会儿需要用到!
AIDLTest项目的MyService代码:**

public class MyService extends Service {
    ....
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("MyService","服务创建了");
...
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("MyService","服务启动了");
        return super.onStartCommand(intent, flags, startId);
    }
...
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("MyService","服务绑定了");
        return mb;
    }
    ...

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("MyService","服务解绑了");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("MyService","服务销毁了");

    }
}

**AIDLDemo项目中,
指定访问我们刚刚提到的AIDLTest项目的包名
以及MyService的action标签:**

  • **成了,先运行AIDLTest项目【提供Service方】,

再运行AIDLDemo项目【访问方】,
AIDLDemo项目中点击按钮,观察logcat,
可以看到我们在AIDLDemo项目中操作的时候,
成功跨进程开启了另外一个进程APP【AIDLTest】的Service了!!!**

跨进程绑定服务

AIDL实战开始!!

  • **以上的方式只能做到跨进程开启、绑定服务,

但是无法进行通信,监控另一个进程的进度;
所以这里就要使用AIDL了!**

  • **AIDL是作为

两个进程间 数据共享的接口!**

一般性步骤

  • **创建aidl文件,

【aidl文件用于定义进程间的接口,
进程两端的文件要保持一致】;**

  • **创建好了AIDL文件之后,

build一下会自动生成java文件;**

  • 使用AIDL;

  • **1/3

创建aidl文件,
服务提供方先创建,即 AIDLTest项目
在对应的包处 new 一下就好了:
在弹出的窗口处点击Finish后,成功创建,
项目会自动生成一个包:

【刚刚是右键aidltest包创建的AIDL文件,
所以这里生成的包跟aidltest包的完整包名是一致的】
初始生成的AIDL文件 —— IMyAidlInterface.aidl:**

// IMyAidlInterface.aidl
package com.lwp.aidltest;

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

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);
}
  • 添加自定义的业务方法【需要提供给其他进程使用的业务】:
...
interface IMyAidlInterface {
    ...
            
    //定义自己所需要的方法:显示当前服务的进度
    void showProgress();        
}
  • **2/3

build一下项目:
可以看到项目build/generated/下生成了aidl相关的包
(generated包表示该包下放着的都是自动生成的代码),
展开之后可以看到自动生成的java文件:**
**注意这里生成的是java文件
我们刚刚自定义的文件是aidl文件,并不能直接使用

稍微浏览一下生成的java文件,
可以看到它首先定义了一个静态抽象类Stub!!!!!!!!!
Stub类 继承Binder类,表明通信作用
Binder类是实现IBinder接口的;public class Binder implements IBinder
所以Stub类也间接实现了IBinder接口)!!!!!!!
同时它实现了我们刚刚自定义的aidl文件(接口)!!!!!!!!!:
我们自定义的aidl文件中的接口方法,
在生成的这个接口中,都会有两个方法对应,
第一个是重写(override)的,第二个是重新生成的声明:
**

**3/3
使用AIDL!!!
调用的核心,就是使用刚刚我们提到静态内部抽象类stub!!!!
(即,我们最终使用的接口类,!!!!!
是AS自动生成的aidl文件接口对应的java接口类!!!!!!!!!)
AIDLTest项目 中的MyServiceonBind方法中,
返回刚刚build生成aidl文件接口对应的java接口类实例
匿名内部类的形式实现业务方法!!!!!!!
(非跨进程情况,这里返回的是自定义Service类 内部自定义的Binder类
下面是使用aidl接口后,
!!!!!!!!!!!!!
提供服务本线程内调用服务方法的写法!!!!!!!!!!!!!
!!!!!!!!!!!!!:接着运行项目,
点击启动服务,接着点击绑定服务,测试成功:**

接着是另外一个进程提供服务进程服务跨进程调用的写法

  • **上面说了,

IPC两边的进程准备的AIDL文件都需要保持一致
所以接下来,
AIDLDemo项目创建一个aidl包
aidl包创建一个包用于存放AIDL文件
这个用于存放AIDL文件的包的包名需要跟
服务提供方【AIDLTest项目】存放aidl文件的包名保持一致!!!!!!
接着把 AIDLTest项目中的AIDL文件
直接复制粘贴、覆盖到AIDLDemo项目中的aidl包下对应的包下:
**

  • **Rebuild一下AIDLDemo项目,自动生成Java代码,

因为使用的AIDL文件跟AIDLTest项目的一样,
所以生成的文件也都是一样:**

  • 接着使用AIDL接口:
  • **运行两个项目,然后在AIDLDemo项目的APP上操作,

可以看到AIDLTest项目是有对应的响应的,
即,实现跨进程调用服务方法:**

  • **注意,

这里使用AIDL是可以方便生成IPC所需的接口代码,
但是其实读懂自动生成的Java接口文件,
懂得其中的IPC编程规范,要自己编写而不用AIDL文件也是可以的;
AIDL文件只是方便我们自动生成代码工具
真正使用的以及实现跨进程逻辑的,
是AS根据AIDL文件自动生成Java接口文件!!!!**






参考:慕课网

相关文章
|
15天前
|
消息中间件 API Go
微服务的进程间通信(IPC)
微服务的进程间通信(IPC)
30 6
|
4天前
|
人工智能 PyTorch 算法框架/工具
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
【8月更文挑战第6天】Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
|
12天前
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
69 8
|
17天前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【8月更文挑战第3天】在软件开发中,高效的进程间通信(IPC)对于构建复杂系统至关重要。本文通过分布式日志处理系统的案例,演示如何利用Python实现可靠的IPC。系统由多个收集日志的进程及中心服务器构成,选用套接字作为IPC机制以支持跨网通信与并发。实战包括定义通信协议、实现日志发送与接收功能,并进行测试部署。此方案不仅展现了Python在IPC领域的强大能力,还为实际应用中的错误处理、数据安全等问题提供了思考方向。
15 1
|
18天前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【8月更文挑战第2天】在编程领域中,进程间通信(IPC)作为连接独立运行单元的关键桥梁,其重要性不言而喻。本文以Python为例,深入探讨了IPC的各种机制。首先对比了管道与消息队列:管道作为一种基础IPC机制,适用于简单场景;而消息队列通过第三方库如RabbitMQ或Kafka支持更复杂的多生产者多消费者模型,具备高并发处理能力。
16 1
|
17天前
|
Python
Python IPC深度探索:解锁跨进程通信的无限可能,以管道与队列为翼,让你的应用跨越边界,无缝协作,震撼登场
【8月更文挑战第3天】Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
13 0
|
17天前
|
消息中间件 数据采集 数据挖掘
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【8月更文挑战第3天】在数字化时代,随着软件系统复杂性的提升,Python IPC(进程间通信)技术让多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的管道(Pipe),进程可直接、实时地交换数据,犹如配备对讲机,使数据从采集到预处理、分析及展示各阶段流畅衔接,效率倍增且错误减少。此外,IPC还提供消息队列、共享内存、套接字等机制,适应不同场景需求,使进程间的合作如同团队游戏般精准无误,共同构建高效、健壮的软件系统。
22 0
|
17天前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【8月更文挑战第3天】你是否苦恼于Python程序间的“信息孤岛”现象?进程间通信(IPC)技术能助你打破壁垒。IPC是使不同进程共享数据或信号的方法。因全局解释器锁(GIL),多进程配合IPC成为高效处理数据的选择。Python提供管道、消息队列、共享内存等多种IPC手段。例如,管道适合简单父子或兄弟进程通信;套接字不仅限于网络通信,还能实现本地进程间复杂数据交换。掌握IPC,让你的进程协同作战,构建更强大灵活的系统。
9 0
|
18天前
|
消息中间件 数据库 开发者
深度剖析!Python IPC的奥秘,带你走进进程间通信的微观世界
【8月更文挑战第2天】在编程领域中,进程间通信(IPC)是构建复杂软件系统的关键,使数据能在独立进程间流通。本文以Python为例,深入介绍了IPC的基本概念及其实现机制,包括管道、消息队列、套接字等,并重点展示了如何使用Socket进行网络IPC。通过服务器-客户端示例,演示了数据收发过程。此外,还提到了`multiprocessing`模块提供的高级IPC工具,如队列和共享内存,这些工具在实现进程间通信时更加高效。希望通过本文能帮助开发者更好地理解和运用Python IPC技术,构建高效协作的软件系统。
9 0
|
18天前
|
消息中间件 安全 数据库
动手实操!Python IPC机制,打造高效协同的进程军团
【8月更文挑战第2天】在 software development 领域, Python 的进程间通信 (IPC) 能力对应用性能与稳定性至关重要。Python 提供了多样化的 IPC 机制, 如管道、消息队列、套接字、共享内存等, 每种都有独特优势。本文以动手实践为主, 使用 `multiprocessing` 模块演示 IPC 的实现。示例代码展示了如何利用 `Queue` 在进程间安全高效地传输数据。
25 0