我们提供 apkplug 下OSGI使用demo 源码托管地址为
一 OSGI与android Service 异同点
OSGI服务与android Service概念差不多也是Service ,Client 关系。
android Service接口 --service.AIDL
OSGI接口 --java interface
所以android 进程间通信Service只能传递序列化过的数据 而OSGI服务可以传递任何java对象。
二 OSGI与android Service注册/查询方式对比
1.服务注册
android Service
<code>1</code>
<code>Intent intent=</code><code>new</code> <code>Intent(Context,Service.</code><code>class</code><code>);</code>
<code>2</code>
<code>Context.startService(intent);</code>
OSGI Service
<code>BundleContext context; </code><code>//插件上下文</code>
<code>ServiceRegistration m_reg = context.registerService(</code>
<code>3</code>
<code> </code><code>sayHelloImp.</code><code>class</code><code>.getName(),</code><code>//服务名称 一般为接口类名</code>
<code>4</code>
<code> </code><code>my, </code><code>//服务具体实现类</code>
<code>5</code>
<code> </code><code>null</code><code>);</code>
2.服务查询
android Service
<code>Context.bindService(intent, </code><code>new</code> <code>ServiceConnection())</code>
<code>...</code>
OSGI Service
<code>01</code>
<code>//利用插件上下文BundleContext查询服务</code>
<code>02</code>
<code> </code><code>ServiceReference ref = context.getServiceReference(Service.</code><code>class</code><code>.getName());</code>
<code>03</code>
<code> </code><code>if</code> <code>(ref != </code><code>null</code> <code>) {</code>
<code>04</code>
<code> </code><code>//查找到服务</code>
<code>05</code>
<code> </code><code>Service service = (Service) context.getService(ref);</code>
<code>06</code>
<code> </code><code>if</code> <code>(service != </code><code>null</code> <code>) {</code>
<code>07</code>
<code> </code><code>//调用服务接口</code>
<code>08</code>
<code> </code><code>service.sayHello(imp);</code>
<code>09</code>
<code> </code><code>}</code>
<code>10</code>
<code> </code><code>//注销服务</code>
<code>11</code>
<code> </code><code>context.ungetService(ref);</code>
<code>12</code>
<code> </code><code>}</code>
三 OSGI服务特点
OSGI服务是暂态的插件可能随时被关闭或卸载,所以我们每次在使用服务的时候都最好先查询服务是否还存在。
四 OSGI服务注意事项
使用OSGI服务时应注意服务接口java类的一致性,服务者与消费者应使用相同的java接口(类加载器相同),否则可能出现服务查询时类型强制转换异常。一般情况下我们以服务者提供java接口