38

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

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

像这样:

String doSomething(in String a, out String[] b);

我理解“in”,即当从活动中调用该方法时将数据发送到远程。

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

请帮忙..

4

2 回答 2

54

AIDL中,out标签指定了一个仅输出参数。换句话说,它是一个在输入时不包含任何有趣数据的参数,但会在方法期间填充数据。

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

void copyArray(in byte[] source, out byte[] dest);

inout标签表示参数对输入和输出都有意义。例如:

void charsToUpper(inout char[] chars);

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

于 2011-03-24T18:05:43.033 回答
11

就这样,

  • 它只是一个指示数据流向的方向标签。
    • 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);
}

在这里,我们使用了 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。

于 2019-01-31T19:47:52.223 回答