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

时间:2011-01-15 14:58:03

标签: android interface aidl

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

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

像这样:

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

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

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

请帮助..

2 个答案:

答案 0 :(得分:50)

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

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

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

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

void charsToUpper(inout char[] chars);

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

答案 1 :(得分:4)

在这里,

  • 它只是一个定向标记,指示数据的处理方式。
    • 输入-将对象从客户端转移到仅用于以下目的的服务 输入
    • -将对象从客户端转移到仅用于服务的对象 用于输出。
    • 输入-对象从客户端转移到服务 用于输入和输出。
  • 所有非原始参数都需要一个方向标记,以指示数据的处理方式。进,出或进出。

  • 原语默认为,否则不能为其他

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

示例: 请检查下面的AIDL界面以更好地了解它。

grid.setStyle("-fx-background-color: red;");

在这里,我们已使用 out in inout 方向标记来指示数据的处理方式。

  1. getTeamCaptian(TeamMember成员): 获取球队的队长。 这里的“ out ”方向标记表示,当客户调用此方法时,“成员”对象没有相关数据, 但是服务器应更改“成员”对象,因此客户端应获取更新的“成员”对象。 实际上,方法调用是同步

  2. updateTeamMember(inout TeamMember成员,以boolean isLeader为单位): 更新团队人数。 这里的“ inout ”方向标记表示,当客户调用此方法时,“成员”对象中包含相关数据。 服务器应使用输入数据并进行处理。一旦过程完成,客户应取回相关数据。 实际上,方法调用是同步

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