基于Android 6.0的源码剖析, 分析bind service的启动流程。
/frameworks/base/core/java/android/app/ContextImpl.java
/frameworks/base/core/java/android/app/LoadedApk.java
/frameworks/base/core/java/android/app/IServiceConnection.aidl(自动生成Binder两端)
一. unbind
文章bindService启动过程分析,介绍了 bindService 的过程,本文介绍其对应的另一个操作 unbind。
unbind调用链:
AMP.unbindService
AMS.unbindService
AS.unbindServiceLocked
AS.removeConnectionLocked
ATP.scheduleUnbindService
AT.scheduleUnbindService
AT.handleUnbindService
Service.onUnbind
AS.bringDownServiceIfNeededLocked
AS.bringDownServiceLocked
ATP.scheduleUnbindService
AT.scheduleUnbindService
ATP.scheduleStopService
AT.scheduleStopService
1.1 AMP.unbindService
... //省略,未完待续
二. onServiceDisconnected
当service所在进程死亡后,binderDied死亡回调后触发的。
2.1 binderDied
[-> LoadedApk.ServiceDispatcher.DeathMonitor]
private final class DeathMonitor implements IBinder.DeathRecipient
{
DeathMonitor(ComponentName name, IBinder service) {
mName = name;
mService = service;
}
public void binderDied() {
death(mName, mService); //【见流程2.2】
}
final ComponentName mName;
final IBinder mService;
}
2.2 death
[-> LoadedApk.ServiceDispatcher]