IPC进程间通信,源码分析
4. IPC进程间通信,源码分析
// app/ContextImpl.java
bindService()--> bindServiceCommon()--> ActivityManagerNative.getDefault().bindService()
// ActivityManagerNative.getDefault() --ActivityManager.getService()
// --IActivityManagerSingleton.get()
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE); // 跨进程了
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
// IActivityManager() 是binder转过来的。
-->
ActivityManagerService.java
--> mServices.bindServiceLocked()
ActiveServices.java
--> requestServiceBindingLocked(s, b.intent, callerFg, false)
--> r.app.thread.scheduleBindService()
// IApplicationThread thread. 是ActivityThread里面的内部类 ApplicationThread。
ApplicationThread.java
--> scheduleBindService()--sendMessage(H.BIND_SERVICE, s);
ActivityThread.java
--> handleBindService()
--> Service s = mServices.get(data.token);
--> IBinder binder = s.onBind(data.intent); // 调用了MessageService 的 onBind 方法
--> ActivityManagerNative.getDefault().publishService(data.token, data.intent, binder)
// 把service/ binder,公开出去了
如何进入 onServiceConnected ?
ActivityManagerService.java
--> publishService(IBinder token, Intent intent, IBinder service)
--> mService.publishServiceLocked((ServiceRecord)token, intent, service)
ActiveServices.java
--> publishServiceLocked()
--> c.conn.connected(r.name, service) // TODO 连接
IServiceConnection --IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(getOuterContext(), conn);
ConnectionRecord.java
IServiceConnection conn
LoadedApk.java
--> forgetServiceDispatcher()
--> return sd.getIServiceConnection() // mIServiceConnection
--> InnerConnection extends IServiceConnection.Stub
--> connected(ComponentName name, IBinder service)
--> sd.connected(name, service) // TODO 连接
--> doConnected(name, service, dead)
--> mConnection.onServiceConnected(name, service);
// 最终调用mServiceConn 的连接回调方法。形成闭环。