我希望每个应用程序都能够将数据发送到我的服务。因此我需要进程间通信。我能找到的每个页面都建议使用Messenger,AIDL或Intents(BroadcastReceiver)。到目前为止,我可以通过构建一些测试应用程序来解决的问题是,如果在while(true)
循环中发送多个线程,则BroadcastReceiver非常慢并且消息可能会丢失而不会发出通知。 AIDL和Messenger不仅实现起来很复杂(需要服务,绑定器......),但是可以提供奇怪的行为,例如当使用AIDL发送多个线程导致RemoteException(!!! FAILED BINDER TRANSACTION !!!)时使用oneway关键字。我想确保交货有保证。是否有理由在保证交货时使用oneway
?
尽管如此,LocalSocket似乎非常容易使用(不需要服务,就像java socket一样)。客户端应用程序可以只打开一个LocalSocket,连接到提供的地址,然后while(true) outputstream.writeObject();
使用LocalSocket时有任何缺点,因为android开发者页面说“有些应用尝试使用传统的Linux技术(如网络套接字和共享文件)实现IPC。我们强烈建议您使用IPC的Android系统功能”,但不会进一步评论就此而言
使用LocalSocket时是否有任何缺点
LocalSocket
在框架级别没有安全性。虽然您可能“希望每个应用程序都能够将数据发送到我的服务”,但用户可能不会,这就是为什么标准IPC可以通过权限进行保护的原因。startService()
和bindService()
将导致创建服务实例,甚至为您启动进程。您的服务不会一直运行。所以,无论如何你需要startService()
或bindService()
。AIDL:只有当您允许来自不同应用程序的客户端访问AIDL
的服务并希望在您的服务中处理多线程时,才需要使用IPC
。
Binder:如果你不需要在不同的应用程序中执行并发IPC
,你应该通过实现Binder
来创建你的界面。
Messenger:如果你想执行IPC
,但不需要处理多线程,请使用Messenger
实现你的界面。