我剛剛開始使用OSGi編程,並且遇到了兩種激活服務的方法。何時使用ServiceTracker vs ServiceReference
第一種方式,從EclipseRCP書,使用服務引用:
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();
其中哪一個是正確的和/或持有實現給定接口的所有服務的註冊的最佳方式?是否有另一種方法來完成這個?爲什麼似乎有兩種方法來做同樣的事情?