Anroid 分析:proxy模式理解Manager和Service

本文介绍了Android系统中Context提供的getSystemService接口如何通过ContextImpl加载一系列服务代理对象,并将这些对象存放在HashMap表中。详细解释了当用户调用服务方法时,代理对象如何将请求传递给实际的服务组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Android 通过 Context提供getSystemService的接口, 而是实现类是 ContextImp




ContextImpl.java 的Load时(Static),会创建一堆 service proxy 对象,而后将其放入HashMap表中, 比如StatusBarManager


当用户调用 Service 方法的时候, Proxy 对象会将其传给真正在 ServiceManager 中注册的 Service. 表面上看就是 Manager是 Proxy对象, Service 是真正的对象.

这样的好处:
当 Service 不存在时,用户依然可以调用 Manger的接口,只是传不到Service, 基本没有任何动作而已

06-05 06:24:05.669 5900 5900 D AndroidRuntime: Shutting down VM 06-05 06:24:05.672 5900 5900 E AndroidRuntime: FATAL EXCEPTION: main 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Process: com.avatr.cockpit.settings, PID: 5900 06-05 06:24:05.672 5900 5900 E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.avatr.cockpit.settings.CockpitSettingsApplication: java.lang.SecurityException: Permission Denial: Component com.avatr.cockpit.settings/.service.SettingsService requests FLAG_SINGLE_USER, but app does not hold android.permission.INTERACT_ACROSS_USERS 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7107) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2305) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:218) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Looper.loop(Looper.java:307) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8309) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Caused by: java.lang.SecurityException: Permission Denial: Component com.avatr.cockpit.settings/.service.SettingsService requests FLAG_SINGLE_USER, but app does not hold android.permission.INTERACT_ACROSS_USERS 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.createExceptionOrNull(Parcel.java:3079) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:3063) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3046) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2988) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6047) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1931) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ContextImpl.startService(ContextImpl.java:1900) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.content.ContextWrapper.startService(ContextWrapper.java:825) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.avatr.cockpit.settings.CockpitSettingsApplication.onCreate(CockpitSettingsApplication.java:20) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1316) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7102) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: ... 9 more 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace: 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActivityManagerService.isSingleton(ActivityManagerService.java:13546) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.retrieveServiceLocked(ActiveServices.java:4394) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:833) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:794) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActivityManagerService.startService(ActivityManagerService.java:13415) 06-05 06:24:05.672 5900 5900 E AndroidRuntime:
06-07
08-07 07:08:15.784 9288 9328 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService 08-07 07:08:15.784 9288 9328 E AndroidRuntime: java.lang.RuntimeException: No data directory found for package android 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.app.ContextImpl.getDataDir(ContextImpl.java:2549) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:629) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:856) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:478) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at com.android.server.display.DisplayPowerController.saveCurrentBrightness(DisplayPowerController.java:797) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at com.android.server.display.DisplayPowerController.updatePowerState(DisplayPowerController.java:941) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at com.android.server.display.DisplayPowerController.access$900(DisplayPowerController.java:95) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at com.android.server.display.DisplayPowerController$DisplayControllerHandler.handleMessage(DisplayPowerController.java:2076) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.os.Looper.loop(Looper.java:223) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:67) 08-07 07:08:15.784 9288 9328 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:44)
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值