不使用 Activator,而是使用带有声明式服务 'activate(ComponentContext)' 方法的组件或服务(我们将其称为 A)。在 activate 方法中,您可以像往常一样实例化您的 ServiceTracker。
在 A 的 activate 方法中实例化 ServiceTracker 时,也可以将 AdapterFactory 传入 ServiceTracker。您可以通过将 AdapterFactory 拉出从 ComponentContext 获取的 BundleContext 或(甚至更好)使用 DS 并使其成为 A 组件的服务引用来获取 AdapterFactory。
那就是说:你为什么需要 ServiceTracker?除非我误解,否则您可以使用 DS 绑定和取消绑定来接收有关服务可用性的事件。
编辑:使用多个基数的绑定/取消绑定行为的(旧)示例:http: //blog.tfd.co.uk/2009/11/12/declarative-optional-multiple-references-flaky-in-osgi/
编辑:两种方法的比较,但并没有过多地进入绑定/取消绑定:http: //njbartlett.name/2010/08/05/when-servicetrackers-trump-ds.html
EDIT2:也就是说:我的一般政策是不使用激活器,除非在极少数情况下。使用 DS、ipojo 等,并使用您使用这些技术定义的组件,以便访问 BundleContext 以构建更多低级对象,例如 ServiceTrackers。