AIDL接口参数值中的"输入/输出/输出"?

The*_*san 34 android interface aidl

我正在编写一个无线电流媒体应用程序.我通过使用AIDL接口技术与服务进行通信,将"无线电播放"作为远程服务运行.但我真的不明白一件事.

AIDL接口参数值中的"out"是什么?

像这样:

String doSomething(in String a, out String[] b);
Run Code Online (Sandbox Code Playgroud)

我理解"在"中,即从活动调用方法时将数据发送到远程.

什么是"out",为什么我们需要在同一方法中"in"和"out"?在哪种情况下使用它们("out/inout")?为什么String[]"出局"?

请帮忙..

gla*_*ded 51

AIDL中,out标记指定仅输出参数.换句话说,它是一个参数,不包含有关输入的有趣数据,但在方法期间将填充数据.

例如,可以像这样指定复制字节数组的方法:

void copyArray(in byte[] source, out byte[] dest);
Run Code Online (Sandbox Code Playgroud)

inout标记表明该参数对输入和输出的意思.例如:

void charsToUpper(inout char[] chars);
Run Code Online (Sandbox Code Playgroud)

这很重要,因为必须对每个参数的内容进行编组(序列化,传输,接收和反序列化).输入/输出标签允许Binder跳过编组步骤以获得更好的性能.


Har*_*ian 9

来了,

  • 它只是一个指示数据去向的方向标签。
    • in - 对象从客户端传输到仅用于输入的服务
    • out - 对象从客户端传输到仅用于输出的服务。
    • inout - 对象从客户端传输到用于输入和输出的服务。
  • 所有非原始参数都需要一个指示数据去向的方向标签。无论是输入、输出还是输入。

  • 原语默认情况下,不能在其他情况下

  • 请注意,来自客户端的 RPC 调用是同步的
  • 您应该将方向限制为真正需要的方向,因为编组参数很昂贵。

示例:请查看下面的 AIDL 接口以更好地理解它。

package com.hardian.sample.aidl;
import com.hardian.sample.aidl.TeamMember;

interface ITeamManageService {
void getTeamCaptian(out TeamMember member);
void updateTeamMember(inout TeamMember member, in boolean isLeader);
oneway void removeTeamMember(in TeamMember member);
}
Run Code Online (Sandbox Code Playgroud)

这里我们使用了 outininout方向标签来指示数据的去向。

  1. getTeamCaptian(out TeamMember member):获取团队的队长。这里的“ out ”方向标签的意思是,当客户端调用这个方法时,“member”对象没有相关数据,但是服务器要对“member”对象进行修改,所以客户端要获取更新后的“member”对象. 实际上,方法调用是同步的

  2. updateTeamMember(inout TeamMember member, in boolean isLeader):更新团队的队长。这里的“ inout ”方向标签的意思是,当客户端调用这个方法时,“member”对象里面有相关的数据。服务器将使用输入的数据并对其进行处理。该过程完成后,客户端应取回相关数据。实际上,方法调用是同步的

  3. removeTeamMember(in TeamMember member) 从团队中删除一个成员。这里的“ in ”方向标签表示,“成员”对象从客户端传输到仅用于输入的服务。如果对服务中的“成员”对象进行了任何更改,则它不会反映在客户端中。方法调用是异步的,我们可以在方法签名中加上“ oneway ”关键字。异步方法不能有“out”和“inout”参数,它们也必须返回void。