在讲解之前,我们应该明白如何学习这些osgi包。
官网上讲得很详细。附网址:https://osgi.org/javadoc/r4v43/core/index.html
在这里,只讲一些笔者觉得相对重要的。在工程中经常会出现下面四个osgi包
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;
一、org.osgi.framework.BundleActivator;
定制bundle的启动和停止
有两个方法:
void start(BundleContext context)
当这个bundle启动时框架会调用start()方法
void stop(BundleContext context)
当bundle停止时,框架会调用stop()方法
二、org.osgi.framework.BundleContext;
BundleContext是一个OSGi框架传递给我们的Bundle的一个魔力入场券。当代码需要在任何时候与框架交互时,你将用到BundleContext。
事实上这是用OSGi API交互的唯一方法,并且框架在Bundle启动的时候将这些入场券发通过它们的BundleActivator发给每一个Bundle。
当 Bundle 启动的时候, OSGi 框架就创建这个 Bundle 的 BundleContext 对象, 直到 Bundle 停止运行从OSGi 容器卸载为止。当bundle激活时,BundleContext 对象被传递给
BundleActivator.start(BundleContext) ,当bundle停止时,BundleContext 对象被传递给
BundleActivator.stop(BundleContext) 。
有几个经常用到的方法:
BundleContext.registerService():在 OSGi 容器中注册服务
BundleContext.getService() :从当前 OSGi 容器中获取已有的服务
BundleContext.addBundleListener():在 OSGi 容器中注册事件监听器
BundleContext.getProperty():获取 Bundle 所处环境的环境属性
getServiceReferences():获取服务的引用
registerService():注册服务
addServiceListener():增加服务监听者
每个 Bundle 的 BundleContext 对象都是在调用 Bundle.start() 方法时由 OSGi 框架创建并以方法参数的形式传入到 Bundle 中, 实现 Bundle 时一般会把这个对象的引用保留起来, 以便在 Bundle 其他代码中使用。
三、org.osgi.framework.ServiceListener
是一个监听接口
有一个方法:
void serviceChanged(ServiceEvent event)
四、org.osgi.framework.ServiceEvent
其中ServiceEvent有四种值,分别为
MODIFIED :当注册的服务被改动时
MODIFIED_ENDMATCH :注册服务的属性已经修改,新的属性不再匹配侦听器的过滤器
REGISTERED :当服务被注册时
UNREGISTERING :当服务被卸载
有两个方法:
getServiceReference():返回一个服务的引用
getType():返回时间的类型