关闭

LocalService

767人阅读 评论(0) 收藏 举报
分类:
为了提升通信的效率,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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:98142次
    • 积分:7345
    • 等级:
    • 排名:第2995名
    • 原创:692篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论