Android AIDL基本使用

这篇具有很好参考价值的文章主要介绍了Android AIDL基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AIDL是Android多进程通讯方式一种。

如要使用 AIDL 创建绑定服务,请执行以下步骤:

  1. 创建 .aidl 文件

    此文件定义带有方法签名的编程接口。

  2. 实现接口

    Android SDK 工具会基于您的 .aidl 文件,使用 Java 编程语言生成接口。此接口拥有一个名为 Stub 的内部抽象类,用于扩展 Binder 类并实现 AIDL 接口中的方法。您必须扩展 Stub 类并实现这些方法。

  3. 向客户端公开接口

    实现 Service 并重写 onBind(),从而返回 Stub 类的实现。

以下是 .aidl 文件示例

// IMyAidlInterface.aidl
package com.jason.aidlserver;

// 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);


   String  getInfo() ;
}

服务端实现接口 : 

功能实现,由客户端发送数据过来,简单保存一下aString。然后客户端读取时候返回。 

class AidlServerService :Service(){

    private var aS :String?  = "empty"

   private   val mBinder = object: IMyAidlInterface.Stub (){

        override fun basicTypes(
            anInt: Int,
            aLong: Long,
            aBoolean: Boolean,
            aFloat: Float,
            aDouble: Double,
            aString: String?
        ) {

            aS = aString

        }

        override fun getInfo(): String {

            return  " RemoteService保存数据 => $aS"
        }
    }

    override fun onBind(intent: Intent?): IBinder {
         return mBinder
    }
}

然后我们在注册清单 AndroidManifest给server加上权限。

<permission
    android:name="jason.aidl"
    android:protectionLevel="normal" />
<uses-permission android:name="jason.aidl" />
<service
    android:name=".AidlServerService"
    android:exported="true"
    android:permission="jason.aidl">
    <intent-filter>
        <action android:name="jason.aidl.action" />
    </intent-filter>
</service>

这样server端服务已经开发好了,只需要在Activity把这个服务启动即可。 

客户端集成接口: 

客户端还必须拥有接口类的访问权限,因此如果客户端和服务在不同应用内,则客户端应用的 src/ 目录内必须包含 .aidl 文件(该文件会生成 android.os.Binder 接口,进而为客户端提供 AIDL 方法的访问权限)的副本。 

代码示例:  

class MainActivity : AppCompatActivity() {

    private lateinit var tvMsg :TextView
    private var autoMex :Int = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tvMsg = findViewById(R.id.tv_msg)

        findViewById<Button>(R.id.btn_connect).setOnClickListener {
            val intent = Intent( "jason.aidl.action")
            intent.setClassName("com.jason.aidlserver","com.jason.aidlserver.AidlServerService")
            bindService(intent,connect, Context.BIND_AUTO_CREATE)
        }

        findViewById<Button>(R.id.btn_send).setOnClickListener {
            remoteService?.basicTypes(1,2L,true,1.5F,2.5,"haha ${autoMex ++}")
        }

        findViewById<Button>(R.id.btn_get).setOnClickListener {
           tvMsg.text =  remoteService?.info
        }
    }

    private var remoteService  :IMyAidlInterface ? = null

    private val connect = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            remoteService = IMyAidlInterface.Stub.asInterface(service)
            tvMsg.text = "onServiceConnected"
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            remoteService= null
            tvMsg.text = "onServiceDisconnected"
        }
    }

    override fun onDestroy() {
        unbindService(connect)

        super.onDestroy()
    }
}

因为我们给server端记上了权限,那么客户端需要把对应权限加上 。否者会权限错误无法连接到远程服务。 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jason.aidlclient">

    <!--sdk 30后需要加上 -->
    <queries>
        <package android:name="com.jason.aidlserver"/>
    </queries>
    <!--加上服务权限 -->
    <uses-permission android:name="jason.aidl"/>

展示效果: 

android aidl,Android开发,android

通过 IPC 传递对象

 可以通过 IPC 接口,将某个类从一个进程发送至另一个进程。不过,您必须确保 IPC 通道的另一端可使用该类的代码,并且该类必须支持 Parcelable 接口。支持 Parcelable 接口很重要,因为 Android 系统能通过该接口将对象分解成可编组至各进程的原语。

如要创建支持 Parcelable 协议的类,您必须执行以下操作:

  1. 让您的类实现 Parcelable 接口。
  2. 实现 writeToParcel,它会获取对象的当前状态并将其写入 Parcel
  3. 为您的类添加 CREATOR 静态字段,该字段是实现 Parcelable.Creator 接口的对象。
  4. 最后,创建声明 Parcelable 类的 .aidl 文件。

    如果您使用的是自定义编译进程,请勿在您的构建中添加 .aidl 文件。此 .aidl 文件与 C 语言中的头文件类似,并未经过编译。

AIDL 会在其生成的代码中使用这些方法和字段,以对您的对象进行编组和解编。

AIDL官方文档指南: Android 接口定义语言 (AIDL)  |  Android 开发者  |  Android Developershttps://developer.android.google.cn/guide/components/aidl?hl=zh-cn#Expose文章来源地址https://www.toymoban.com/news/detail-703146.html

到了这里,关于Android AIDL基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [Android AIDL] --- AIDL原理简析

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

    2024年02月10日
    浏览(39)
  • hal深入剖析之aidl实战-android framework车机车载手机系统开发

    这个是hal工程根目录 接下来要创建aidl的文件存放目录 注意mkdir -p android/hardware/mytest其实就是包名目录,即模块包名就是android.hardware.mytest. 提示:这个如果为了项目的更加好的维护性建议到自己项目目标的vendor下面进行,目前只是为了演示方便,直接在system的hardware下面 创建

    2024年02月19日
    浏览(47)
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

    Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inter-Process Communication,进程间通信)。 Binder 的核心是 Binder 驱动程序,它负责管理不同进程之间的通信。每个进程都可

    2024年02月07日
    浏览(40)
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛,和底层的Binder机制紧密关联。 在Android源码或者Android Studio中通常是自动编译aidl文件,生成对应语言的接口文件。 做应用层Java开发,aidl和binder封装的比较“干净”,不用太多的涉及binder的调用细节,也不用太关心aidl的编译过程。 如果是做中

    2024年02月08日
    浏览(40)
  • Android:AIDL实战详解

    AIDL:Android Interface Definition Language AIDL是为了实现进程间通信而设计的Android接口语言 Android进程间通信有多种方式,Binder机制是其中最常见的一种 AIDL的本质 就是基于对Binder的运用从而实现进程间通信 这篇博文从实战出发,用一个尽可能精简的Demo,实现两个App (也是两个进程:

    2024年02月08日
    浏览(39)
  • Android studio 无法创建AIDL文件

    Android studio 创建AIDL文件的时候 提示是灰色的无法创建 处理方法在app下面的build.gradle中的buildFeatures 添加 aidl = true 这个是 kotlin的写法,如果是使用的旧项目修改下格式就行

    2024年01月25日
    浏览(37)
  • android aidl进程间通信封装通用实现

    接上一篇的分析,今天继续 aidl复杂流程封装-CSDN博客 今天的任务就是将代码梳理下放进来 1 项目gradle配置:    需要将对应的代码放到各自的目录下,这里仅贴下关键内容,细节可以下载代码慢慢看     sourceSets {         main {             manifest.srcFile \\\'src/main/AndroidManife

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

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

    2024年04月28日
    浏览(27)
  • 深入解析Android AIDL:实现跨进程通信的利器

    Android Interface Definition Language (AIDL) 是一种Android系统中的跨进程通信机制。AIDL允许一个应用程序的组件与另一个应用程序的组件通信,并在两者之间传输数据。 AIDL的主要作用是帮助不同进程间共享数据和服务,让他们能够互相调用。例如,在开发一个多功能的音乐播放器时,

    2024年02月19日
    浏览(41)
  • Android:AIDL简单介绍+传递简单数据+传递复杂数据

    对于AIDL的学习,这些也只能说是我在学习中的理解,有理解不到位或者错的地方也欢迎指正。 AIDL的目的就是实现进程之间的通信, 尤其是在涉及多进程并发情况下的进程间通信 。可以将aidl理解为两个进程之间的桥梁,并制定规则,使其传输特定数据。 1.AIDL支持的数据类型

    2024年02月21日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包