我刚开始使用OSGi编程,并且有两种方法可以监听正在激活的服务。
第一种方法,来自EclipseRCP一书,使用ServiceReference:
String filter="(objectclass="+IModelCreator.class.getName()+")";
context.addServiceListener(this, filter);
modelCreators = Collections.synchronizedMap(
new HashMap<ModelID, List<IModelCreator>>());
ServiceReference references[] = context.getServiceReferences(null, filter);
if(references==null) return;
for(int i=0;i<references.length;++i) {
this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
references[i]));
}
第二个,来自互联网示例,使用ServiceTracker:
ServiceTracker logReaderTracker = new ServiceTracker(context,
org.osgi.service.log.LogReaderService.class.getName(), null);
logReaderTracker.open();
Object[] readers = logReaderTracker.getServices();
if (readers != null) {
for (int i = 0; i < readers.length; i++) {
LogReaderService lrs = (LogReaderService) readers[i];
m_readers.add(lrs);
lrs.addLogListener(m_logger);
}
}
logReaderTracker.close();
哪一个是保存实现给定接口的所有服务的寄存器的正确和/或最佳方式?有没有其他方法来实现这一目标?为什么似乎有两种方法可以做同样的事情?
答案 0 :(得分:15)
正如您已经可以从表格派生的那样,包名org.osgi.util.tracker.ServiceTracker
是ServiceTracker
一个实用类(在某些情况下)
简化了使用来自的服务 Framework的服务注册表。
在编程中总有几种做事方式。您可以自己管理ServiceReferences,或者它是否适合您或您的问题使用具有其用例的捆绑实用程序类。
同时检查此Best practices for accessing services
其他一些消息来源表明,大多数时候使用ServiceTracker