为啥即使活动和服务在同一个进程中,Binders(用于 IPC)

Posted

技术标签:

【中文标题】为啥即使活动和服务在同一个进程中,Binders(用于 IPC)【英文标题】:Why Binders(used for IPC) even when activity and services are in the same process为什么即使活动和服务在同一个进程中,Binders(用于 IPC) 【发布时间】:2021-09-19 14:39:49 【问题描述】:

Binders 用于进程间(而非内部)进程通信/远程方法调用,因此在没有不同进程参与的情况下,为什么/如何通过 binders 实现 Activity 和 Service 之间的通信。

当应用程序的第一个组件被初始化时,如果不存在相应的进程,则对内核的请求会触发(我认为是通过 ActivityManagerService(Native)-AMS > AMN)(在 system_process 中运行)用于新的进程分叉。创建流程后,除非指定,否则任何其他组件(例如服务)都属于同一流程。现在该服务想要与同一进程的 Activity 进行通信。那为什么 IBinder 是其中一种选择呢?

这是否违反了创建 Binder 的基本原则?

【问题讨论】:

【参考方案1】:

进程间通信是通过将数据写入某个源(如套接字或管道)和另一个进程读取它来完成的。同一个进程没有理由不能读写,虽然它比在进程中传递数据的其他方式效率低,但它仍然有效。

至于你为什么要在同一个进程中使用它——另一种选择是让 android 有两种与服务通信的方式,一种方式表示它们是否是同一个进程,另一种方式表示它们不是.这将使获取最小收益的框架变得复杂。对于客户端可能在或可能不在同一进程中的服务(例如,客户端应用程序和同一公司的其他应用程序都使用的服务),这会使事情变得非常复杂。所以他们只是对两者使用相同的方法。

【讨论】:

以上是关于为啥即使活动和服务在同一个进程中,Binders(用于 IPC)的主要内容,如果未能解决你的问题,请参考以下文章

ContentProvider 和 Binder IPC

为啥即使在纵向模式下,主要活动框架的宽度也大于高度?

为啥我的 python 脚本没有显示为进程,即使它正在运行?

TCP的保活机制

为啥从管道读取会阻塞进程?

为啥即使在节点服务器和 mongodb 加载后 localhost 也没有加载?