Eclipse framework之service tracker
本文以eclipse 4.20为参考.
serviceTracker相较于serviceListener更方便使用, 从功能上说, 它实际上是 serviceListener + filter.
指定要跟踪的serviceReference
serviceTracker的构造有3种形式, 可以根据需要选择.
- 关注特定serviceReference的serviceEvent.
- 关注特定class的一类serviceReferences的serviceEvent.
- 直接指定filter, 关注匹配该filter的serviceReferences的serviceEvent.
关于tracked object
tracked object是接口ServiceTrackerCutomizer引入的概念.
public interface ServiceTrackerCustomizer<S, T> {
public T addingService(ServiceReference<S> reference);
public void modifiedService(ServiceReference<S> reference, T service);
public void removedService(ServiceReference<S> reference, T service);
}
ServiceTrackerCutomizer对应了ServiceEvent的几个事件类型. 而addingService()的返回值就是tracked object, 它会回传给modifiedService()和removedService()中. ServiceTracker.Tracked负责保存service object与tracked object的对应关系.
在ServiceTracker的默认实现中, 该tracked object就是service object本身.
open和close
ServiceTracker object需要open()开始跟踪service, close()结束跟踪service.
open()的作用是向serviceRegistry增加filteredServiceListener. filteredServiceListener是带有filter的serviceListener, 当有serviceEvent发布时, filteredServiceListener使用filter过滤, 用匹配的event回调serviceListener(即ServiceTracker.Tracked).
一图胜万言.
<osgi_serviceTracker.png>
一花一世界 2021/8/4
|