Skip to content

宿主程序开发指南

Gray Liu edited this page Aug 19, 2019 · 4 revisions

只需两步,就能让你的宿主程序接入Neptune

第1步:添加Neptune SDK Library依赖

在APP模块的build.gradle中添加以下依赖

implementation 'com.iqiyi.video:neptune:2.7.0'

第2步,在Application#onCreate阶段初始化Neptune SDK运行环境

@Override
public void onCreate() {
    NeptuneConfig config = new NeptuneConfig.Builder()
                .configSdkMode(NeptuneConfig.INSTRUMENTATION_MODE)
                .enableDebugMode(BuildConfig.DEBUG)
                .build();
    Neptune.init(this, config);
}

完成以上两步,插件SDK环境初始化完成,后续就可以下载,安装,加载插件了。插件一旦加载成功,插件内部的逻辑和跳转都不需要宿主干预,和原生流程一致。

插件安装/卸载/启动

安装一个插件

给定插件apk文件路径,安装插件

File apkPath = new File(context.getFilesDir(), "sample.apk");
Neptune.install(context, apkPath.getAbsolutePath(), new IInstallCallBack.Stub(){

    @Override
    public void onPackageInstalled(PluginLiteInfo info) throws RemoteException {
        // 处理安装成功回调,比如启动插件
    }

    @Override
    public void onPackageInstallFail(PluginLiteInfo info, int failReason) throws RemoteException {
        // 处理安装失败回调,比如弹toast提醒用户
    }
})

卸载一个插件

给定插件的包名,卸载对应的插件

String pkgName = "com.plugin.sample";
Neptune.uninstall(context, pkgName, new IPluginUninstallCallBack.Stub(){
   @Override
   public void onPluginUninstall(String packageName, int resultCode) throws RemoteException {
      // 处理卸载成功回调
   }
})

启动插件的组件

宿主中启动插件的组件,必须使用PluginManager#launchPlugin()方法,这里没有Hook Instrumentation的原因是我们期望尽量减少对宿主的干预,而且在Instrumentation中无法区分是要启动插件还是独立APP,在我们的业务场景中,有些插件业务的包名和其独立APP包名是相同的,在Instrumentation中无法区分这种场景。在宿主中使用固定的API启动插件,也方便做统一的版本控制和兼容性处理。

Intent intent = new Intent();
String pkgName = "com.plugin.sample";
ComponentName cn = new ComponentName(pkgName, "XXXActivity");
intent.setComponent(cn);
if (Neptune.isPackageInstalled(context, pkgName)) {
  // 插件已安装
  Neptune.launchPlugin(context, intent);
} else {
  // 插件未安装,可以先下载安装插件
}