Quand utiliser ServiceTracker vs ServiceReference

Je commence tout juste avec OSGi programmation et avons rencontré deux façons à l'auditeur pour les services en cours d'activation.

La première manière, à partir d'un EclipseRCP livre, utilise 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]));
}

La seconde, à partir de l'internet des exemples, utilise 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();

Lequel des deux est le bon et/ou de meilleure façon de tenir un registre de tous les services qui implémentent une Interface donnée? Est-il une autre façon de régler ce problème? Pourquoi ne semble y avoir deux façons de faire la même chose?

source d'informationauteur KitsuneYMG