天天看点

android插件化-apkplug中OSGI服务基本原理-08

我们提供 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接口