宿主使用插件中功能性服务

在宿主应用中可以得到插件在OSGI中注册的服务,然后使用其功能。具体实现需要如下步骤:

前提:需要插件端开发,参见下面:插件提供功能性服务

1 引用插件中声明的接口

2 查询服务:在OSGI中查询服务接口的具体实现

3 调用服务:在OSGI中如果查询到服务实现,则可以调用功能

具体代码如下:

1 引用插件中声明的接口: 将宿主声明的接口打成jar包,在插件中引用,并且打包插件时不能把引用的接口加入,因为如果同样的接口加入宿主中,宿主引用插件时会出现重复的类而无法识别。

例如gradle需要使用provided而不能使用compile:

   provided files('libs/functionservice.jar')

2 查询服务和调用:

   //查询服务
    OSGIServiceAgent<FunctionService> agent = new OSGIServiceAgent<FunctionService>(
            bundleContext,//BundleContext
            FunctionService.class,//服务接口类型
            "(serviceName=FunctionServiceImpl)", //服务查询条件
            OSGIServiceAgent.real_time);   //每次都重新插件
   //调用服务
    try {
        agent.getService().func1();
        int i = agent.getService().func2();
        agent.getService().func3(this);
    } catch (Exception e) {
        e.printStackTrace();
    }

插件提供功能性服务

插件可以通过向OSGI注册服务实现来向宿主应用提供功能调用。需要如下几步:

1 声明接口:声明插件中可以提供的功能接口

2 实现声明的功能性接口

3 向OSGI注册服务

4 宿主应用调用

具体实现如下:

1 声明接口:

public interface FunctionService {
     void func1();
     int func2();
     void func3(Object Callback);
}

2 实现宿主声明的接口:

public class FunctionServiceImpl implements FunctionService {
@Override
public void func1() {
    //dosomething
}

@Override
public int func2() {
    //dosomething
    return 0;
}

@Override
public void func3(Object Callback) {
    //dosomething
}
}

3 向OSGI注册服务

    FunctionServiceImpl functionService = new FunctionServiceImpl();

    //定义服务查询条件
    Dictionary<String,Object> properties =new Hashtable<String,Object>();
    properties.put("serviceName", "FunctionServiceImpl");

    ServiceRegistration m_reg = bundleContext.registerService(
            FunctionService.class.getName(),
            functionService,
            properties);

4 宿主应用调用

参见上面:宿主使用插件中功能性服务

5 示例demo:

DefaultOSGIServiceDemo

DefaultOSGIClientDemo

*