From cb39fb738a3af9046e15cfb9f7d229a7462ba9fc Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 26 May 2020 08:34:54 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Service=20=E7=BB=84=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../四大组件的启动过程/Service 组件的启动过程.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/blogs/Android/Framework/源代码情景分析/四大组件的启动过程/Service 组件的启动过程.md b/blogs/Android/Framework/源代码情景分析/四大组件的启动过程/Service 组件的启动过程.md index 9b6e745..4b08bad 100644 --- a/blogs/Android/Framework/源代码情景分析/四大组件的启动过程/Service 组件的启动过程.md +++ b/blogs/Android/Framework/源代码情景分析/四大组件的启动过程/Service 组件的启动过程.md @@ -300,3 +300,29 @@ public int bindService(IApplicationThread caller, IBinder token, Intent service, } ``` +ServiceRecord 类的成员函数 retrieveAppBindingLocked 的实现如下所示: + +```java +class ServiceRecord extends Binder { + final HashMap bindings = new HashMap<>(); + + public AppBindRecord retrieveAppBindingLocked(Intent intent, ProcessRecord app) { + Intent.FilterComparison filter = new Intent.FilterComparison(intent); + IntentBindRecord i = bindings.get(filter); + if(i==null) { + i = new IntentBindRecord(this, filter); + bindings.put(filter, i); + } + AppBindRecord a = i.apps.get(app); + if(a!=null) { + return a; + } + a = new AppBindRecord(this, i, app); + i.apps.put(app, a); + return a; + } +} +``` + +当一个应用程序进程绑定了一个 Service 组件之后,用来描述这个应用程序进程的一个 ProcessRecord 对象就会被保存在用来描述这个被绑定的 Service 组件的一个 ServiceRecord 对象的成员变量 bingdigs 中。由于一个 Service 组件可能会被多个应用程序进程绑定,因此,用来描述这个 Service 组件的一个 ServiceRecord 对象就会使用一个 IntentBindRecord 对象来描述这些应用程序进程,并且以一个 FilterComparison 对象为关键字保存在该 ServiceRecord 对象的成员变量 bingdings 中。 +