ServiceTracker何时取消ServiceReference?

时间:2017-04-22 09:11:28

标签: java osgi

我在很多文章中都读到,只要使用服务就必须取消服务。我的意思是

//1. get service
ServiceReference reference = bundleContext.getServiceReference(Foo.class.getName());
 Foo foo=(Foo) bundleContext.getService(reference);
//2. use service
 foo.foo();
//3. unget service
bunldeContext.ungetService(reference)

除了here

  

OSGi框架维护每个服务的使用次数   束。

这是一方面的。另一方面,osgi服务来去匆匆,所以在动态世界中保留对osgi服务的引用是不好的做法,但是在需要时获取服务是一种好习惯。

如果这个陈述正确,那么ServiceTracker呢?据我所知,它保留了服务和ServiceReference的引用,因为服务来了并保持它们直到服务进行。但是,ServiceReference必须像服务一样使用soos?或者在ServiceTracker的情况下,我们的意思是服务使用时间=跟踪器打开的时间?

所以主要的问题是 - ServiceTracker何时取消ServiceReference以及为什么?

1 个答案:

答案 0 :(得分:2)

您应该使用OSGi的声明式服务而不是使用原始服务API甚至服务跟踪器。也就是说,Service Tracker会监听服务事件以查找正在跟踪的服务。因此,当服务未注册或跟踪器关闭时,它将取消服务。