gpt4 book ai didi

android - 为什么Android Bound Services文档提示IBinder不能跨进程使用?

转载 作者:行者123 更新时间:2023-11-29 19:11:30 25 4
gpt4 key购买 nike

来自 https://developer.android.com/guide/components/bound-services.html :

If your service is private to your own application and runs in the same process as the client (which is common), you should create your interface by extending the Binder class and returning an instance of it from onBind(). The client receives the Binder and can use it to directly access public methods available in either the Binder implementation or the Service.

This is the preferred technique when your service is merely a background worker for your own application. The only reason you would not create your interface this way is because your service is used by other applications or across separate processes.

If you need your interface to work across different processes, you can create an interface for the service with a Messenger...

这似乎暗示您不会使用 Binder 进行进程间通信,但是 IBinder documentation相反的说法:

Base interface for a remotable object, the core part of a lightweight remote procedure call mechanism designed for high performance when performing in-process and cross-process calls. This interface describes the abstract protocol for interacting with a remotable object. Do not implement this interface directly, instead extend from Binder.

The key IBinder API is transact() matched by Binder.onTransact(). These methods allow you to send a call to an IBinder object and receive a call coming in to a Binder object, respectively. This transaction API is synchronous, such that a call to transact() does not return until the target has returned from Binder.onTransact(); this is the expected behavior when calling an object that exists in the local process, and the underlying inter-process communication (IPC) mechanism ensures that these same semantics apply when going across processes.

Binder documentation :

You can, however, derive directly from Binder to implement your own custom RPC protocol or simply instantiate a raw Binder object directly to use as a token that can be shared across processes.

This class is just a basic IPC primitive...

许多其他页面也提到了 IPC 上下文中的绑定(bind)器。我误会了什么?

最佳答案

IBinder 提供远程对象的基本接口(interface)Binder 是 IBinder 的一个实现,它提供了创建远程对象的本地实现的标准支持。

当服务和客户端都在同一进程中运行时,只需扩展 Binder 并返回 Binder 的子类实例就足以通过绑定(bind)到服务来与服务通信,如下所示Binder 是 IBinder 的一个实现,它提供了创建远程对象的本地实现的标准支持。

当服务在单独的进程中运行并且服务的客户端可以在任何其他进程中运行时,我们需要实现 IBinder 并提供支持远程对象远程实现的实现。这可以通过以下两种方式之一实现:

使用 AIDL

使用 AIDL,我们可以编写一个我们想要公开的接口(interface)。 aidl 工具然后可以解析此文件并自动生成 Stub 和一些样板代码,这些代码对于 IPC 的所有应用程序都是通用的。然后我们可以扩展 Interface.Stub 以在服务端提供实现。

客户可以在他们的项目中包含此 AIDL 文件,IPC 代码由 aidl 工具自动生成。现在,客户端可以绑定(bind)到您的服务并使用 AIDL 文件中声明的接口(interface)进行通信。

使用 Messenger

Messenger 是对 Handler 的引用,其他人可以使用它向它发送消息。这允许跨进程实现基于消息的通信,方法是在一个进程中创建一个指向 Handler 的 Messenger,并将该 Message 传递给另一个进程。这个 IPC 是使用 AIDL 本身在内部实现的。 HereIMessenger.aidl 接口(interface),Messenger 在内部使用它来公开客户可以用来与主机进程通信的契约(Contract)。

总结

IBinder 可用于进程内和进程间通信。使用它进行进程间通信时,只需使用 AIDL 公开接口(interface)即可。

关于android - 为什么Android Bound Services文档提示IBinder不能跨进程使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com