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接口文件!!!!**






参考:慕课网

相关文章
|
4月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
5月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
220 8
|
2月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
3月前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
4月前
|
前端开发 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的世界里,自定义控件如同画家的画笔,能够绘制出独一无二的界面。通过掌握自定义控件的绘制技巧,开发者可以突破系统提供的界面元素限制,创造出既符合品牌形象又提供卓越用户体验的应用。本文将引导你了解自定义控件的核心概念,并通过一个简单的例子展示如何实现一个基本的自定义控件,让你的安卓应用在视觉和交互上与众不同。
|
4月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
80 6
|
5月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
215 3
|
5月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
5月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
481 4
|
5月前
|
算法 调度 UED
操作系统中的进程管理:原理与实践
在数字世界的心脏跳动着无数进程,它们如同细胞一般构成了操作系统的生命体。本文将深入探讨进程管理的奥秘,从进程的诞生到成长,再到最终的消亡,揭示操作系统如何协调这些看似杂乱无章却又井然有序的活动。通过浅显易懂的语言和直观的比喻,我们将一起探索进程调度的策略、同步机制的重要性以及死锁问题的解决之道。准备好跟随我们的脚步,一起走进操作系统的微观世界,解锁进程管理的秘密吧!
105 6

热门文章

最新文章

  • 1
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
  • 2
    【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
  • 3
    如何在宿主主机运行容器中的php守护进程
  • 4
    c++ linux通过实现独立进程之间的通信和传递字符串 demo
  • 5
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 6
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 8
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 9
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 10
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 相关实验场景

    更多