美文网首页
IPC进程间通信,源码分析

IPC进程间通信,源码分析

作者: xqiiitan | 来源:发表于2024-07-02 12:12 被阅读0次

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 的连接回调方法。形成闭环。

4.2 三个NDK类:service_manager.c, binder.c, binder.h。

相关文章

网友评论

      本文标题:IPC进程间通信,源码分析

      本文链接:https://www.haomeiwen.com/subject/mymvcjtx.html