【发布时间】:2012-01-16 02:12:45
【问题描述】:
对于我的应用程序,我需要在我的活动和服务之间传递数据,这两者都在不同的进程中。我知道 Google 建议在将意图发送到最低限度(不是全尺寸位图)时保持数据传递。当您通过 AIDL 与服务通信并希望通过远程方法调用传递数据时,是否适用类似的策略?
【问题讨论】:
对于我的应用程序,我需要在我的活动和服务之间传递数据,这两者都在不同的进程中。我知道 Google 建议在将意图发送到最低限度(不是全尺寸位图)时保持数据传递。当您通过 AIDL 与服务通信并希望通过远程方法调用传递数据时,是否适用类似的策略?
【问题讨论】:
http://developer.android.com/reference/android/os/TransactionTooLargeException.html
" 在远程过程调用期间,调用的参数和返回值作为 Parcel 对象传输,存储在 Binder 事务缓冲区中。如果参数或返回值太大而无法放入事务缓冲区,则调用将失败并抛出 TransactionTooLargeException。
Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。 "
看来,您永远不应该发送任何大小超过 1MB 的参数。当然,如上面的 android 网站所述,您也可能因较小的参数而失败。
【讨论】:
我不确定 AIDL,但通常您确实希望将Intent 附加功能保持在最低限度。更好的解决方案可能是实现您自己的ContentProvider 并使用它为您的其他进程提供数据。这将允许托管数据传输,并为您提供ContentProvider API 提供的所有额外保护。
【讨论】:
Vertex Buffer Object。
BroadcastReceiver 和ContentProvider 来管理此事务。