本文介绍一下RePlugin外置插件使用方式,使用的是官方demo2中的模拟配置。
步骤一:把需要作为外置插件的项目打包生成demo1.apk
步骤二:把apk拷贝到宿主项目assets/xxx/下,xxx命名随意,保持一致即可
这里是跟官方demo一样,结构如图:
步骤三:在触发下载外置插件的地方调用代码
//判断是否已安装demo1插件,如未安装就下载安装,如已安装跳转页面
if (RePlugin.isPluginInstalled("com.test.qby.myapplication")) {
RePlugin.startActivity(this, RePlugin.createIntent("com.test.qby.myapplication", "com.test.qby.myapplication.plugin.PluginActivity"))
} else {
Toast.makeText(this@MainActivity, "正在下载插件,请在下载完成后重新尝试!", Toast.LENGTH_SHORT).show()
val pd = ProgressDialog.show(this@MainActivity, "Installing...", "Please wait...", true, true)
Thread {
downApk()
pd.dismiss()
}.start()
}
/**
* 模拟安装或升级(覆盖安装)外置插件
* 为方便演示,外置插件临时放置到Host的assets/external目录下
*/
private fun downApk() {
val demo1Apk = "demo1.apk"
val demo1apkPath = "external" + File.separator + demo1Apk
// 文件是否已经存在?直接删除重来
val pluginFilePath = filesDir.absolutePath + File.separator + demo1Apk
val pluginFile = File(pluginFilePath)
if (pluginFile.exists()) {
FileUtils.deleteQuietly(pluginFile)
}
// 开始复制
copyAssetsFileToAppFiles(demo1apkPath, demo1Apk)
var info: PluginInfo? = null
if (pluginFile.exists()) {
info = RePlugin.install(pluginFilePath)
}
runOnUiThread({
if (info != null) {
Toast.makeText(this@MainActivity, "install success!", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@MainActivity, "install external plugin failed", Toast.LENGTH_SHORT).show()
}
})
}
/**
* 从assets目录中复制某文件内容
* @param assetFileName assets目录下的Apk源文件路径
* @param newFileName 复制到/data/data/package_name/files/目录下文件名
*/
private fun copyAssetsFileToAppFiles(assetFileName: String, newFileName: String) {
var ins: InputStream? = null
var fos: FileOutputStream? = null
val buffsize = 1024
try {
ins = this.assets.open(assetFileName)
val allLength = ins!!.available()
fos = this.openFileOutput(newFileName, Context.MODE_PRIVATE)
var byteCount = 0
var length = 0
val buffer = ByteArray(buffsize)
while (byteCount != -1) {
fos!!.write(buffer, 0, byteCount)
byteCount = ins!!.read(buffer)
length += byteCount
//下载进度
Log.e("MainActivity","总长度="+ Formatter.formatFileSize(this,allLength.toLong())+"下载进度="+Formatter.formatFileSize(this,length.toLong()))
}
fos!!.flush()
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
ins!!.close()
fos!!.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
这样就已经完成了外置插件的下载和页面的跳转,实际应用中应当是从服务器下载。
注意:此时,只能使用插件的包名com.test.qby.myapplication来进行页面跳转。
RePlugin还提供了另外一种方式来进行跳转:【别名】
1.在插件清单文件中配置插件别名、插件版本
<meta-data
android:name="com.qihoo360.plugin.name"
android:value="plugin1"/>
<meta-data
android:name="com.qihoo360.plugin.version.var"
android:value="100"/>
修改其中的value值,即可修改插件别名,插件版本,版本号自行定义。
官方提示:
关于别名.png 关于版本.png详细参考 【插件的信息】
2.重复步骤一、步骤二
3.宿主跳转代码
RePlugin.startActivity(this, RePlugin.createIntent("plugin1", "com.test.qby.myapplication.plugin.PluginActivity"))
当然,你依然使用包名进行跳转也是可以的。
以上仅个人学习记录,如有疏漏或谬误,欢迎留言交流!
网友评论