假设我正在使用service A
在另一个中导入的a service B
。在B
正常运行时(当然是活动的),在运行时卸载A
会发生什么?
service A
service B
Service A -> Service B
如果我使用ServiceReference
, ServiceTracker
&会有什么不同的场景DS
?
假设我正在使用service A
在另一个中导入的a service B
。在B
正常运行时(当然是活动的),在运行时卸载A
会发生什么?
service A
service B
Service A -> Service B
如果我使用ServiceReference
, ServiceTracker
&会有什么不同的场景DS
?
当一项服务在 OSGi 中未发布时,会向当前使用该服务的所有捆绑包发送一个事件,告诉他们应该停止使用它。
如果您使用的是 DS,您的 unbind 方法将被调用。当它被调用时,您应该尽最大努力尽快停止使用该服务。但归根结底,OSGi 是一个协作系统,它不能强迫你发布服务。但是,如果您不这样做,则可能会导致问题,例如服务发布者将不会被完全垃圾收集。您最终会破坏 OSGi 平台的动态,可能会造成内存泄漏等。
如果您正在使用,则将调用ServiceTracker
该removedService
方法,并且您需要以相同的方式响应。但是我不是在另一个问题中告诉你不要使用ServiceTracker
吗?;-)
如果您正在使用,ServiceReference
那么您需要显式注册 aServiceListener
才能接收这些事件。这就是为什么你真的不应该使用这个低级 API,直到你获得了更多的经验(一旦你有了这种经验,你无论如何都不想使用它!)。
首先:OSGi的优点之一是框架和标准服务的行为被明确规定。这些规范可以从OSGi 联盟网站下载,或者,如果您不喜欢阅读 PDF,可以订购打印。您提出的问题在这些规范中得到了完美的回答。
也就是说,总而言之:当服务未注册时:
ServiceReference
对象保持原样。但是,调用ServiceReference.getService()
将返回 null。请注意,在使用ServiceReference
s 时,您应该释放对通过 检索的实际服务对象的任何引用getService()
,这通常需要对服务进行某种跟踪。ServiceTracker
ServiceTracker.remove
被称为。这通常会导致调用removedService()
on theServiceTracker
或 defined ServiceTrackerCustomizer
。unbind
调用被引用服务的定义方法(如果指定)。此外,如果使用的服务的基数表明该服务是强制性的,则根据替代服务的可用性和为服务定义的策略,使用的服务也可能被取消注册,甚至可能被停用或激活新的实例。