【问题标题】:Is it necessary to remove service references in OSGi?是否有必要在 OSGi 中删除服务引用?
【发布时间】:2016-05-05 11:16:13
【问题描述】:

我正在使用 OSGi 框架 Knopflerfish,因为我现在可以通过注册服务来调用 bundle 来做某事,我需要删除该服务吗?

因为我找不到任何方法来删除该服务。 通过检查BundleContext中长度为“getAllService()”和ServiceTracker.getServices()的服务,我可以看到服务的总数在增加,即使我调用了“ungetService(ServiceReference)”。

那么是否有必要删除服务或“ungetService”就足够了? 如果有必要,我该如何删除该服务?

【问题讨论】:

  • 我删除了对 Android 的引用,因为这是一个纯粹的 OSGi 问题,Android 似乎不相关。
  • @NeilBartlett 我正在使用 Knopflerfish 开发一个 android 应用程序,但你是对的,这似乎与 Android 无关,谢谢。

标签: osgi knopflerfish


【解决方案1】:

ungetService 不是registerService 的反义词,而是getService 的反义词,即消费者拨打的电话。

如果您使用registerService 方法注册服务,它会返回一个ServiceRegistration 对象。当您不再希望您的服务可供消费者使用时,您应该对该对象调用 unregister 方法。请注意,如果您的捆绑软件停止,它注册的任何服务都将自动取消注册。

但是,我想知道您是否真的应该深入研究最低级别的 OSGi API。对于 99% 的用例,您应该使用更高级别的框架,例如声明式服务。这将为您省去很多痛苦,并使您的代码更加可靠和可读。

【讨论】:

  • 所以我只能在注册服务的捆绑包中取消注册服务?有什么方法可以获取注册对象吗?无论如何,谢谢,因为我还是 OSGi 的新手,我稍后会转到声明式服务。
  • 是的。目的是只有注册服务的参与者才能取消注册它。要获取注册的对象,请调用 getService - 任何包都可以这样做。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2013-09-20
  • 2011-10-28
  • 2014-07-14
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多