安卓远程方法数据限制

4

为了我的应用程序,我需要在不同进程中的活动和服务之间传递数据。我知道Google建议在发送意图时尽量减少传递的数据(不包括完整大小的位图)。当您通过AIDL与服务通信并希望通过远程方法调用传递数据时,是否适用类似的策略?

2个回答

9

http://developer.android.com/reference/android/os/TransactionTooLargeException.html

在远程过程调用期间,调用的参数和返回值作为存储在Binder事务缓冲区中的Parcel对象进行传递。如果参数或返回值太大而无法放入事务缓冲区中,则调用将失败,并且将抛出TransactionTooLargeException异常。

Binder事务缓冲区具有有限的固定尺寸,目前为1MB,由进程中正在进行的所有事务共享。

所以看起来,您不应该发送任何大小超过1MB的参数。当然,如果参数过小也会导致失败,如上面的android网站所解释的那样。


1

我不确定AIDL,但通常你确实希望尽量减少Intent extras。更好的解决方案可能是实现自己的ContentProvider并使用它来向其他进程提供数据。这将允许进行受控数据传输,并为您提供ContentProvider API提供的所有额外保护。


我可能应该提供更多细节。我的活动从引擎获取一个字节数组。有可能在现有的字节数组尚未保存/仍在保存时,我会得到一个新的字节数组。在我保存它们之前,我想将这些数组保存在RAM缓冲区中。这就是我计划在我的服务中要做的事情。 - android_devrah
那么创建一个存储这些字节数组的静态变量?但是,您需要小心一次处理多少数据,因为Android VM限制非常低,并且我不确定您正在做什么。如果涉及渲染,您可能需要考虑替代解决方案,例如使用管理缓冲区的“顶点缓冲对象(Vertex Buffer Object)”。 - Codeman
一个静态变量在两个不同的进程中是不可见的。我需要将字节数组从活动进程传递到服务进程,以便服务进程可以在后台进行保存,即使活动本身退出。 - android_devrah
1
抱歉,您没有提到这是一个活动和进程。在我看来,您应该使用BroadcastReceiverContentProvider来管理此事务。 - Codeman
也许我的问题表述不够清晰,但我在原始问题中提到了这一点 - “对于我的应用程序,我需要在不同进程中传递数据,包括活动和服务。” 我仍然不清楚您如何在进程之间传递数据? - android_devrah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接