基于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]