我读过很多文章,有必要在使用服务后立即取消服务。我的意思是

//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怎么办呢?还是就ServiceTracker而言,我们是指服务使用时间=打开跟踪器的时间?

因此,主要问题是-ServiceTracker何时获取ServiceReference,为什么?

最佳答案

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

09-06 01:55