ServiceTracker 的功用
ServiceTracker 的作用如果您的服务消费者需要了解某一接口下的服务对象何时注册、何时取消注册,这时,您应
ServiceTracker 的作用
如果您的服务消费者需要了解某一接口下的服务对象何时注册、何时取消注册,这时,您应使用 ServiceTracker 类:
?
下面,我们看看如何使用服务跟踪器来修改我们的示例代码,具体步骤如下。
1) 修改HelloWorldBundle的MANIFEST.MF文件,让它导入org.osgi.util.tracker包;
2) 新建类HelloServiceTracker.java,其源代码参见清单11。
源代码清单11.HelloServiceTracker.java
public ? class ?Activator? implements ?BundleActivator?{???? ??? ????HelloServiceTracker?helloServiceTracker;???? ??? ????public ? void ?start(BundleContext?context)? throws ?Exception?{???? ??? ????????System.out.println("Hello?World!!" );???? ??? ????????helloServiceTracker=?new ?HelloServiceTracker(context);???? ??? ????????helloServiceTracker.open();???? ??? ????????HelloService?helloService?=?(HelloService)helloServiceTracker.getService();???? ??? ????????System.out.println(helloService.sayHello());???? ??? ????? ??? ????}???? ??? ????public ? void ?stop(BundleContext?context)? throws ?Exception?{???? ??? ????????System.out.println("Goodbye?World!!" );???? ??? ????????helloServiceTracker.close();???? ??? ????}???? ??? }???
?
我们看到,在初始的start()方法中,我们首先新建一个HelloServiceTracker对象,然后要求这个对象跟踪HelloService接口下的服务。这时,我们可以调用getService()方法获得HelloService对象。
如果您试运行上面的示例代码,您会注意到,在启动或停止HelloSerivceBundle时,OSGi 容器都会调用HelloServiceTracker对象的addingService()方法或removedService()方法。
?
总结: 由此可见ServiceTracker与context.getService(reference)的最大区别是,ServcieTracker封装了ServiceListener可以在Service发生变化时被触发,比较适合热插拔。