- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自 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.
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 本身在内部实现的。 Here是 IMessenger.aidl
接口(interface),Messenger
在内部使用它来公开客户可以用来与主机进程通信的契约(Contract)。
总结
IBinder
可用于进程内和进程间通信。使用它进行进程间通信时,只需使用 AIDL 公开接口(interface)即可。
关于android - 为什么Android Bound Services文档提示IBinder不能跨进程使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143078/
我正在尝试测试具有以下定义的事件函数: [FunctionName(nameof(LoadReferenceFromBlobStorage))] public static async Task Ru
我的问题很简单,但我已经为此苦苦挣扎了很长时间! 我有一个调用 onBound() 方法的绑定(bind)服务: @Override public IBinder onBind(Intent
我看到了枚举给定服务(类型)的绑定(bind)列表的方法,但我找不到返回已加载模块中绑定(bind)的所有内容列表的方法。我正在寻找类似Kernel::IEnumerable GetAllRegist
我想找到一个 MethodInitation 的声明节点: MethodInvocation methodNode = ...; IMethodBinding b = methodNode.resol
我有一个由多种类型实现的接口(interface)。但在我做 kernel.GetAll() 之前我希望能够思考注入(inject)的目标类型。 我知道函数 kernel.GetBindings(ty
好吧,我意识到 webjobs sdk 仍处于测试阶段,但它非常酷。尽管在获取我要绑定(bind)的实际对象方面,我在使用 IBinder 方面遇到了一些困难。这可能是显而易见的,所以请原谅我…… 我
我想知道 AIDL 比广播接收器更好的用例,反之亦然。同样,Ibinder 比广播接收器和 AIDL 更好的用例 最佳答案 广播接收者 通信实体的类型:主要是不同的应用。 通信由:发件人触发 接收通信
是否可以在以 TypeScript 或 JavaScript 运行的 Azure 函数中使用 IBinder 功能(或者模仿它的最佳方法是什么)? https://learn.microsoft.co
我需要对通过IPC 从其他进程携带的IBinder 实例进行安全检查。这个IBinder的创建者/接收者可能不是携带它的IPC的直接调用者,所以我不能简单地使用Binder.getCallingUid
当我使用 startService(...) 启动服务时,我一直在寻找获取 ServiceConnection 的方法。 我还没有找到办法,所以我一直在寻找,发现了这个: Does each Acti
在给出的第三段代码的上下文中交谈 on this page , 有一个方法 Messenger named getBinder()返回 the IBinder Messenger 用于与 associ
如何将 FieldDeclaration(类型:ASTNode)转换为 IField(类型:JavaElement)。是否可以从 FieldDeclaration ASTNode 获取绑定(bind)
我想通过单击按钮在我的 EditText 上显示 Google 语音输入 IME。所以,根据this文章和source code我应该写这段代码 inputMethodManager.setInput
我的 Azure 函数场景: HTTP 触发器。 基于 HTTP 参数,我想从适当的存储队列读取消息并返回数据。 这是函数的代码(F#): let Run(request: string, custo
我的 Azure 函数场景: HTTP 触发器。 基于 HTTP 参数,我想从适当的存储队列读取消息并返回数据。 这是函数的代码(F#): let Run(request: string, custo
最近我将我的应用程序迁移到 targetSdkVersion = 28。 将更新后的应用程序发布到 Google Play 后,我开始在 Fabric.io 中收到非常奇怪的崩溃报告: Crash r
我是一名优秀的程序员,十分优秀!