外置插件,应该是这样使用吧:
在页面上显示一个插件图标或者按钮,第一次点击的时候,就开始下载,下载完了就打开。第二次点击的时候,就能自动打开了,并且开始检查插件版本,有新版本就下载下来,然后预加载,下一次打开就是最新的版本了。
效果图.gif
那在宿主的代码就是这样:
//打开外置插件 public void qifumingdeng(View view) { final Button btn_qifu = (Button) findViewById(R.id.btn_qifu); btn_qifu.setClickable(false); MMCPlugin.getInstance().openPlugin(this, "demo4", "oms.mmc.GongdenggeActivity", new MMCPlugin.InstallListener() { @Override public void onInstalling(int progress) { btn_qifu.setText("正在下载祈福明灯插件:" + progress + "%"); if (progress == 100) { btn_qifu.setText("正在安装祈福明灯插件..."); } } @Override public void onFail(String msg) { btn_qifu.setClickable(true); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } @Override public void onSuccess() { btn_qifu.setClickable(true); btn_qifu.setText("打开祈福明灯插件"); } }); }
看代码,有三个监听,第一个onInstalling,是下载插件进度,在这里更新UI进度条。第二个onFail,是下载或者安装插件失败,在这里做一个提示。第三个是onSuccess,无论是初次还是第二次打开,打开插件Activity都会回调到这里的。
那封装的类如下:
public class MMCPlugin { private static MMCPlugin instance = null; private MMCPlugin() { } public static MMCPlugin getInstance() { if (instance == null) { instance = new MMCPlugin(); } return instance; } /** * 打开插件 * * @param context * @param pluginName * @param activityName * @param installListener */ public void openPlugin(Context context, String pluginName, String activityName, InstallListener installListener) { this.installListener = installListener; if (RePlugin.isPluginInstalled(pluginName)) {//判断是否已经安装,安装了的话,就打开Activity,并且检查插件版本,需要更新的话就下载插件 RePlugin.startActivity(context, RePlugin.createIntent(pluginName, activityName)); if (installListener != null) { installListener.onSuccess(); } PluginInfo info = RePlugin.getPluginInfo(pluginName); if (info.getVersion() < 2) { //版本号由你们接口获得,然后进行对比,插件版本低于接口的版本就下载更新 downPlugin(context, "http://插件地址", pluginName, activityName, true); } } else { downPlugin(context, "http://插件地址", pluginName, activityName, false); } } /** * 安装插件 * * @param context * @param pluginName * @param activityName */ public void installPlugin(final Context context, final String pluginName, final String activityName, boolean isUpdate) { final PluginInfo info = RePlugin.install(Environment.getExternalStorageDirectory() + "/" + pluginName + ".apk"); if (info != null) { if (isUpdate) {//判断,是否为更新,如果是更新就预加载,下次打开就是最新的插件,不是更新就开始安装 RePlugin.preload(info); } else { new Thread(new Runnable() { @Override public void run() { RePlugin.startActivity(context, RePlugin.createIntent(info.getName(), activityName)); ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { if (installListener != null) { installListener.onSuccess(); } } }); } }).start(); } } else { if (installListener != null) { installListener.onFail("安装失败"); } } } /** * 下载插件 * * @param context * @param fileUrl * @param pluginName * @param activityName */ public void downPlugin(final Context context, String fileUrl, final String pluginName, final String activityName, final boolean isUpdate) { //获取文件存储权限 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } //下载插件,里面的下载方法可以换成你们自己的,例如okhttp,xutils3等等下载都行,然后在回调中处理那几个方法就行 MMCHttpClient.getInstance(context).downLoadFile(fileUrl, Environment.getExternalStorageDirectory() + "/" + pluginName + ".apk", new MMCHttpClient.OnDownloadListener() { @Override public void onDownloadSuccess() { installPlugin(context, pluginName, activityName, isUpdate); } @Override public void onDownloading(int progress) { if (installListener != null) { installListener.onInstalling(progress); } } @Override public void onDownloadFailed() { if (installListener != null) { installListener.onFail("下载失败"); } } }); } /** * 打开插件的Activity * * @param context * @param pluginName * @param activityName */ public void openActivity(Context context, String pluginName, String activityName) { RePlugin.startActivity(context, RePlugin.createIntent(pluginName, activityName)); } /** * 打开插件的Activity 可带参数传递 * * @param context * @param intent * @param pluginName * @param activityName */ public void openActivity(Context context, Intent intent, String pluginName, String activityName) { intent.setComponent(new ComponentName(pluginName, activityName)); RePlugin.startActivity(context, intent); } /** * 打开插件的Activity 带回调 * * @param activity * @param intent * @param pluginName * @param activityName * @param requestCode */ public void openActivityForResult(Activity activity, Intent intent, String pluginName, String activityName, int requestCode) { intent.setComponent(new ComponentName(pluginName, activityName)); RePlugin.startActivityForResult(activity, intent, requestCode, null); } private InstallListener installListener; public interface InstallListener { void onInstalling(int progress); void onFail(String msg); void onSuccess(); } }
这样就可以实现外置插件的下载更新打开逻辑,根据自己的实际情况修改下就能用到项目中了吧
作者:在寻找雪见的景天
链接:https://www.jianshu.com/p/22b4dec9a2ca
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦