LocalService

为了提升通信的效率,google将service分成binder service 和 local service。
我们先来看local service的实现。
如果service只在本进程使用,则可以将这个service 发布为localservice。避免进程间通信
xref: /frameworks/base/services/core/java/com/android/server/lights/LightsService.java
  public void onStart() {
134        publishLocalService(LightsManager.class, mService);
135    }
136
137    private final LightsManager mService = new LightsManager() {
138        @Override
139        public Light getLight(int id) {
140            if (id < LIGHT_ID_COUNT) {
141                return mLights[id];
142            } else {
143                return null;
144            }
145        }
146    };
例如lightservice中就实现一个service,通过publishLocalService 发布为一个local service
其中mService  是直接调用lightservice 中的函数,因为本来就在同一进程内
要调用publishLocalService ,必须实现SystemService 的子类,如下所示:
public class LightsService extends SystemService 
可见publishLocalService  是由SystemService 来实现的


xref: /frameworks/base/services/core/java/com/android/server/SystemService.java


public abstract class SystemService {
185    protected final <T> void publishLocalService(Class<T> type, T service) {
186        LocalServices.addService(type, service);
187    }
188
189    /**
190     * Get a local service by interface.
191     */
192    protected final <T> T getLocalService(Class<T> type) {
193        return LocalServices.getService(type);
194    }
195
196    private SystemServiceManager getManager() {
197        return LocalServices.getService(SystemServiceManager.class);
198    }
199}




在SystemService和local service 有关的就有上面这三个函数,其中外界只能使用getLocalService 和 publishLocalService。getManager 是SystemService 自己使用的




我们继续看publishLocalService是用泛型实现的,因此可以用于各种类型
185    protected final <T> void publishLocalService(Class<T> type, T service) {
186        LocalServices.addService(type, service);
187    }


xref: /frameworks/base/core/java/com/android/server/LocalServices.java
看看LocalServices.addService 的实现如下:


 public static <T> void addService(Class<T> type, T service) {
53        synchronized (sLocalServiceObjects) {
54            if (sLocalServiceObjects.containsKey(type)) {
55                throw new IllegalStateException("Overriding service registration");
56            }
57            sLocalServiceObjects.put(type, service);
58        }
59    }


原来addService 是一个静态函数,经class type和这个class具体的实现放在一个sLocalServiceObjects 中


private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
34            new ArrayMap<Class<?>, Object>();


而 sLocalServiceObjects 也是一个静态数组。
因为每个进程都有一个LocalServices。所以LocalServices只能由于进程内。
42    @SuppressWarnings("unchecked")
43    public static <T> T getService(Class<T> type) {
44        synchronized (sLocalServiceObjects) {
45            return (T) sLocalServiceObjects.get(type);
46        }
47    }
getService 也是以class type位key从sLocalServiceObjects 数组中拿到是实现的class


举一个使用getLocalService的例子.
xref: /frameworks/base/services/core/java/com/android/server/DeviceIdleController.java
mLocalPowerManager = getLocalService(PowerManagerInternal.class);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值