360插件化方案RePlugin学习笔记-外置插件

本文介绍一下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值,即可修改插件别名,插件版本,版本号自行定义。

官方提示:

关于别名

关于版本

详细参考 【插件的信息】

2.重复步骤一、步骤二

3.宿主跳转代码

RePlugin.startActivity(this, RePlugin.createIntent("plugin1", "com.test.qby.myapplication.plugin.PluginActivity"))

当然,你依然使用包名进行跳转也是可以的。

以上仅个人学习记录,如有疏漏或谬误,欢迎留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值