消息中字符串的优雅解决方案
Posted
技术标签:
【中文标题】消息中字符串的优雅解决方案【英文标题】:Elegant solution for String in Message 【发布时间】:2019-04-03 14:34:42 【问题描述】:我正在编写一个旨在受其他应用程序约束的 android 服务。它使用Messenger
作为IBinder
。
现在我偶然发现了一个问题:如果我想发送一个 Message
和一个 what
和一个 String
,我原本打算使用 Message.obj
来处理它。
正如文档所述,这不起作用:
当使用 Messenger 跨进程发送消息时,如果它包含一个框架类的 Parcelable(不是由应用程序实现的),则它只能是非空的。对于其他数据传输,请使用 setData(Bundle)。
这提出了两个(相关的)问题:
-
为什么在 Android 中
String
不是 Parcelable
?
有没有比为它创建一个 Bundle 并在那里设置我的 String 更“优雅”的解决方案?
【问题讨论】:
【参考方案1】:1)因为它兼容Java的String类,它不是Parcelable(因为Java标准库中不存在 2)因为它通常不需要捆绑 - 在大多数情况下,字符串可以通过网络本地发送,而不是可包裹的。你刚刚发现了一个奇怪的角落案例。
不得不说,在 Binder 上使用 Message 有点奇怪。通常,您只需将数据作为单独的参数发送到调用。
【讨论】:
我认为String
如果在 Android 中扩展到 Parcelable 仍然是兼容的。关于IBinder
Messenger 的奇怪之处:如果服务在自己的进程中运行,我不能使用“单个参数”。我只是按照绑定服务的说明进行操作:developer.android.com/guide/components/bound-services#Messenger
如果他们更改了字符串的签名,它将破坏所有非 android java 库。他们不会那样做。而且我已经写了很多活页夹和完整的助手。从未使用过消息
也许我也应该研究一下自定义 AIDL。一个后续问题:自定义aidl 在抛出TransactionTooLargeException
之前是否仍然强制执行1MB 的最大传输限制?
不到一小时,它都使用捆绑包。所以是的,抓住限制仍然存在。解决它们的一种方法是让应用程序为您提供文件的 url,然后您可以读取内容提供者的错误以上是关于消息中字符串的优雅解决方案的主要内容,如果未能解决你的问题,请参考以下文章