我有以下测试代码,它应该注册并取消注册测试服务。我在 Eclipse 4.5.2 Mail-Demo 应用程序中测试了它。问题是服务没有注销,第二次调用服务不为null。
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
ServiceRegistration<ITestService> registration = bundleContext.registerService(ITestService.class, new TestService(), null);
ServiceReference<ITestService> serviceReference = bundleContext.getServiceReference(ITestService.class);
bundleContext.ungetService(serviceReference);
serviceReference = bundleContext.getServiceReference(ITestService.class);
System.out.println("should be null but is not: " + serviceReference);
这是我得到的输出:
should be null but is not: {unregister.osgiservice.ITestService}={service.id=172, service.bundleid=8, service.scope=singleton}
如何正确注销服务?
编辑:
好的,我发现 ServiceRegistration.unregister()
,如果我添加下面的代码,服务将被取消注册。这就提出了下一个问题,如何从注册服务的另一个地方获取 ServiceRegistration
?
registration.unregister();
serviceReference = bundleContext.getServiceReference(ITestService.class);
System.out.println("now the service is null: " + serviceReference);
输出:
should be null but is not: {unregister.osgiservice.ITestService}= service.id=174, service.bundleid=8, service.scope=singleton}
now the service is null: null
最佳答案
ungetService
只是删除特定的服务引用,它不会取消注册服务。
registerService
返回一个 ServiceRegistration
,您可以使用它来取消注册服务:
ServiceRegistration<ITestService> reg = bundleContext.registerService(ITestService.class, new TestService(), null);
...
reg.unregister();
由您来跟踪服务注册。许多插件将它们存储在插件激活器中。在 Activator start
方法中注册服务并在 stop
方法中取消注册也很常见。
关于java - 如何取消注册 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181447/