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

问题描述 投票:34回答:2

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

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

像这样:

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

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

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

请帮忙..

android interface aidl
2个回答
50
投票

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

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

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

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

void charsToUpper(inout char[] chars);

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


4
投票

在这里,

  • 它只是一个方向标记,指示数据的方向。 in-object从客户端转移到仅用于输入的服务 out - 对象从客户端转移到仅用于输出的服务。 inout - 对象从客户端传输到用于输入和输出的服务。
  • 所有非原始参数都需要一个方向标记来指示数据的传输方式。 in 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);
}

在这里,我们使用了in in direction标签来指示数据的传输方式。

  1. getTeamCaptian(TeamMember成员):获得团队的队长。这里的“out”方向标记意味着,当客户端调用此方法时,“member”对象没有相关数据,但服务器应更改“member”对象,因此客户端应获取更新的“member”对象。实际上,方法调用是同步的。
  2. updateTeamMember(inout TeamMember成员,在boolean isLeader中):更新团队的captian。这里“inout”方向标记意味着,当客户端调用此方法时,“member”对象中包含相关数据。服务器应使用输入数据并对其进行处理。一旦完成该过程,客户端将获得相关数据。实际上,方法调用是同步的。
  3. removeTeamMember(在TeamMember成员中)从团队中删除成员。这里“in”方向标记表示“成员”对象从客户端传输到仅用于输入的服务。如果对服务中的“成员”对象进行了任何更改,则它将不会反映在客户端中。方法调用是异步的,我们可以将“oneway”关键字放到方法签名中。异步方法不能有“out”和“inout”参数,它们也必须返回void。
© www.soinside.com 2019 - 2024. All rights reserved.