-
Notifications
You must be signed in to change notification settings - Fork 113
宿主程序开发指南
Gray Liu edited this page Aug 19, 2019
·
4 revisions
在APP模块的build.gradle
中添加以下依赖
implementation 'com.iqiyi.video:neptune:2.7.0'
@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 {
// 插件未安装,可以先下载安装插件
}