Android远程进程:Messenger与AIDL?哪个更好?

3

我目前拥有一个远程服务,它不断地与同一应用程序中的一个活动进行通信。

有时我需要广泛地发送和接收消息。哪种消息传递方法更好、更快、更省电?是使用消息还是aidl接口?

目前我正在使用aidl接口,但出于某些原因,我认为在附加侦听器时存在很多开销...

非常感谢任何反馈。


为什么你的服务必须在远程进程中运行?此外,为什么它必须持续运行? - Falmarri
1
我的应用程序是一个多媒体音频应用程序,需要在后台运行,这需要大量的资源:内存。如果将此与我的活动放在同一进程中,很可能会出现达到每个进程的资源使用限制的问题。另外,好处是,如果您的用户界面由于某种原因崩溃,您的服务不会受到影响... - Jona
1个回答

6
我目前有一个远程服务,该服务与同一应用程序中的活动不断通信。
通常情况下,远程服务不是一个好主意。
我的应用程序是一个需要在后台运行的多媒体音频应用程序,需要大量资源:内存。如果与我的活动在同一进程中,则很可能会出现达到每个进程的资源使用限制的问题。
那就使用更少的内存。音频播放器甚至不需要超过每个进程的RAM限制,即使有活动。
此外,好处是,如果您的UI由于某种原因崩溃,您的服务不会崩溃。
这不是浪费设备RAM和CPU时间的特别好理由。对于服务器来说这是一个好方法,但对于嵌入式系统来说则不是。
哪种消息传递方法更好、更快、更省电?使用消息还是AIDL接口?
它们应该是相当可比的。IPC考虑应该超过其他影响。例如,引用我书中的内容:
例如,在本书源代码的CPU-Java/AIDLOverhead目录中,您将找到一对实现等效服务中的相同无操作方法的项目。其中一个使用AIDL,并从单独的客户端应用程序进行绑定;另一个是客户端应用程序中的本地服务。然后,客户端为两个服务中的每个服务各调用100万次无操作方法。平均而言,在三星Galaxy Tab 10.1上,对于远程服务,100万个调用需要约170秒,而对于本地服务,则需要约170毫秒。因此,单个远程方法调用的开销很小(~170微秒),但在循环中执行大量这样的调用,或者当用户扔一个ListView时,可能会变得明显。
话虽如此,如果您关心开销(但仍然坚持使用远程服务),最好尝试两种方法,并使用日志记录来确定是否有明显的获胜者。

感谢您的回复。内存使用已经得到了高度优化,但仍然需要使用一定量的内存,而在一些旧手机上可能不可行。原因是有大量的数据处理正在进行中。我没有提到的是,将服务和活动运行在同一个进程中会导致UI变得迟缓,而我注意到使用远程服务可以使事情变得更加顺畅。关于您最后的报价,感谢您的信息,我将运行几个测试用例来确定哪个更好。 - Jona
“远程服务通常不是一个好主意。”如果不是个好主意,他应该使用本地服务吗? - Ewoks

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