AIDL远程Service执行流程

Service

本地服务

远程服务(独立进程)

两种启动方式

startService方式

1
2
3
onCreate
onStartCommand
onDestroy
  • 多次start多次onStartCommand
  • 没有执行bindService的话必须执行stopService
  • 以startService方式启动可以调用bind,也可以调用unbind,但是必须调用destory才可以销毁service
  • 启动后调用bindService后调用stopService并不会销毁服务,调用stopService后调用unBindService会执行onUnbind和onDestroy

bind方式

1
2
3
4
onCreate
onBind
onUnbind
onDestroy

Thread 和 Service的区别

  • Thread的优先级低于Service的优先级
  • 在Thread启动后,如果退出当前Activity,则无法对已经启动的Thread进行操作,而服务则可以——因此可以在服务中启动Thread来解决该问题
  • Service可以进行跨进程访问
    1
    2
    <service android:name=".component.service.RemoteService"
    android:process=":sadf"/>

如果process是:开头的则是对这个app私有的服务

Binder进程间通信机制

只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。说白了,如果你想要跨应用、多线程并发访问,aidl是最好的选择。

sequenceDiagram
Service->>ServiceManager:注册服务映射关系
Client->>Binder内核:拿代理类
Binder内核->>ServiceManager:取服务代理
ServiceManager->>Binder内核:找到对应服务
Binder内核->>ServiceProxy:与服务链接成功,创建服务代理
Binder内核->>Service:返回服务代理
sequenceDiagram
Client->>ServiceProxy:调用transact()方法
ServiceProxy->>Binder内核:序列化
Binder内核->>Service:调用对应方法
Service->>ServiceStub:调用ontransAct()方法
ServiceStub->>Binder内核:序列化
Binder内核->>Client:调用对应方法

进程间通讯原理

  • 他们虚拟内存不同,不共享内存空间
  • 操作系统分为内核态和用户态,进程都在用户态中
  • 通讯必须通过内核态来进行通讯

    Binder原理

  • 传统IPC机制需要拷贝2次内存,缓存到内存缓存区,然后将信息拷贝到接收方

  • Linux利用内存寻址的方式,虚拟内存是映射到物理内存当中的,对虚拟内存的读写实际就是对物理内存的读写
  • 而Binder则需要1次,因为用户态在内核缓存区多了一层内存映射存,减少了一次数据拷贝
谢谢您的鼓励~