bindService启动过程-Android12

Posted xhBruce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bindService启动过程-Android12相关的知识,希望对你有一定的参考价值。

bindService启动过程-android12

android12-release


1. 创建bindService

查看android developer上 创建绑定服务

创建提供绑定的服务时,您必须提供 IBinder,用以提供编程接口,供客户端与服务进行交互之用。您可以通过三种方式定义接口:

  1. 扩展 Binder 类
    如果服务是供您的自有应用专用,并且在与客户端相同的进程中运行(常见情况),您应当通过扩展 Binder 类并从 onBind() 返回该类的实例来创建接口。客户端收到 Binder 后,可利用它直接访问 Binder 实现或 Service 中提供的公共方法。
    如果服务只是您自有应用的后台工作器,应优先采用这种方式。您不使用这种方式创建接口的唯一一种情况是:其他应用或不同进程占用了您的服务。

  2. 使用 Messenger
    如需让接口跨不同进程工作,您可以使用 Messenger 为服务创建接口。采用这种方式时,服务会定义一个 Handler,用于响应不同类型的 Message 对象。此 Handler 是 Messenger 的基础,后者随后可与客户端分享一个 IBinder,以便客户端能利用 Message 对象向服务发送命令。此外,客户端还可定义一个自有 Messenger,以便服务回传消息。
    这是执行进程间通信 (IPC) 最为简单的方式,因为 Messenger 会在单个线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。

  3. 使用 AIDL
    Android 接口定义语言 (AIDL) 会将对象分解成原语,操作系统可通过识别这些原语并将其编组到各进程中来执行 IPC。以前采用 Messenger 的方式实际上是以 AIDL 作为其底层结构。如上所述,Messenger 会在单个线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。不过,如果您想让服务同时处理多个请求,可以直接使用 AIDL。在此情况下,您的服务必须达到线程安全的要求,并且能够进行多线程处理。
    如需直接使用 AIDL,您必须创建用于定义编程接口的 .aidl 文件。Android SDK 工具会利用该文件生成实现接口和处理 IPC 的抽象类,您随后可在服务内对该类进行扩展。

2. bindService启动过程

2.1 时序图

2.2 先启动Service:realStartServiceLocked

查看 startService启动过程-Android12

2.3 handleBindService处理

与startService不同多了handleBindService处理,最终与ServiceConnection建立联系。系统会调用onServiceConnected()该方法以传递服务的 onBind() 方法所返回的 IBinder,使用接口定义的方法开始调用服务。

3. Service超时检查

startService启动过程-Android12
ActiveServices.bumpServiceExecutingLocked -> ActiveServices.scheduleServiceTimeoutLocked

以上是关于bindService启动过程-Android12的主要内容,如果未能解决你的问题,请参考以下文章

Android 源码分析 bindService 启动

Android 源码分析 bindService 启动

Android 源码分析 bindService 启动

Android 四大组件 - bindService 的通信过程

Android使用bindService启动服务

Android-bindService远程服务启动其他应用的Activity