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"/>

展示效果: 

通过 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Android 应用程序中使用 AIDL,您需要执行以下步骤: 1. 创建 AIDL 接口文件 AIDL 接口文件定义了客户端和服务端之间的通信接口。在在 Android Studio 的 app 目录下创建一个名为 aidl 的文件夹,然后在该文件夹下创建一个 .aidl 文件。例如,我们可以创建一个名为 IMyAidlInterface.aidl 的文件。 2. 定义 AIDL 接口 在 IMyAidlInterface.aidl 文件中,我们可以定义客户端和服务端之间需要交换的数据类型和方法。例如: ``` // IMyAidlInterface.aidl package com.example.myaidl; // Declare any non-default types here with import statements interface IMyAidlInterface { int add(int a, int b); } ``` 在上面的例子中,我们定义了一个名为 IMyAidlInterface 的接口,该接口包含一个 add(int a, int b) 方法,用于计算两个整数的和。 3. 实现 AIDL 接口 在服务端应用程序中,我们需要实现上述定义的 AIDL 接口。在服务端应用程序的 Java 代码中,我们需要实现 IMyAidlInterface.Stub 类,它是一个抽象类,继承自 Binder 类。在 IMyAidlInterface.Stub 类中,我们需要实现 add(int a, int b) 方法。例如: ``` public class MyAidlService extends Service { private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() { @Override public int add(int a, int b) throws RemoteException { return a + b; } }; @Nullable @Override public IBinder onBind(Intent intent) { return mBinder; } } ``` 在上面的例子中,我们实现了 add(int a, int b) 方法,该方法计算两个整数的和,并返回结果。 4. 在客户端应用程序中调用 AIDL 接口 在客户端应用程序中,我们需要绑定服务,以获取服务端的实例。然后,我们可以调用服务端的方法。例如: ``` public class MainActivity extends AppCompatActivity { private IMyAidlInterface mIMyAidlInterface; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mIMyAidlInterface = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.myaidl", "com.example.myaidl.MyAidlService")); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); int result = mIMyAidlInterface.add(1, 2); Log.d("MainActivity", "Result: " + result); } } ``` 在上面的例子中,我们绑定服务,以获取服务端的实例。然后,我们调用服务端的 add(int a, int b) 方法,计算两个整数的和,并输出结果。 以上就是使用 AIDL 在不同的应用程序之间进行通信的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值