安卓:什么是Binder线程?

25

我使用Debug.startMethodTracing来实现我的目的,在输出文件中可以看到以下内容(我不使用IPC):

8   Binder Thread #2
7   Binder Thread #1

它是什么?
3个回答

48
Binder线程代表您的服务的一个单独线程。Binder是一种提供进程间通信的机制。
让我们考虑一个例子。假设您有服务进程B(见图片)。您有几个应用程序与此服务B进行通信(其中一个应用程序是例如进程A)。因此,一个服务B应该同时为不同的应用程序提供不同的结果。因此,您需要为不同的应用程序运行多个Service B副本。Android在Process B的不同线程中运行这些副本,这些线程称为“Binder Thread #N”。

Binder communication

我拍摄了这张照片here,您也可以在这里了解Binder是什么。

但我没有使用IPC,我只有一个本地服务。看起来它们是系统级的。好的,谢谢你的反馈。 - pvllnspk
这是否意味着绑定的服务没有在主UI线程上运行? - IgorGanapolsky
1
@IgorGanapolsky 是的,与绑定服务相关联的代码在响应客户端请求时不会在UI线程中运行。 onCreate、onBind、onDestroy等生命周期方法仍将在UI线程中运行。 - Alex W
你从复制的镜像中看到了代理和绑定驱动程序是什么? - Carl G
绑定线程将在哪些函数中运行?我们是否应该以任何方式处理它?是否存在我们应该处理的任何情况?我之所以问这个问题,是因为我注意到了“@BinderThread”注释:https://developer.android.com/studio/write/annotations#thread-annotations - android developer

3
"Binder是提供进程间通信的机制。但Binder并不仅仅是一种IPC机制。所有跨组件流量都是从Binder中抽象出来的,例如本地意图就是一个Binder抽象。"

2
Binder线程是在Android服务绑定和进程间通信中使用的。大多数情况下,您会在使用由Android接口定义语言(AIDL)定义的接口的服务调用中遇到这个概念。
在AIDL的情况下,服务调用由应用程序创建的默认线程池维护的线程执行。这些线程被称为Binder线程,这使得服务能够同时处理多个调用。
通常,使用“扩展Binder类”和“使用Messenger”的接口定义的服务调用是按顺序在一个线程中执行的。
关于“服务绑定和线程”的详细讨论可以在此处找到。
简而言之:
本地进程发起的调用在发起调用的同一线程中执行。远程进程发起的调用则从平台维护在您自己进程内部的线程池中分派。您必须准备好接收来自未知线程的调用,而且可能同时有多个调用发生。换句话说,AIDL 接口的实现必须完全线程安全。

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