外置插件,應(yīng)該是這樣使用吧:
在頁面上顯示一個插件圖標(biāo)或者按鈕,第一次點擊的時候,就開始下載,下載完了就打開。第二次點擊的時候,就能自動打開了,并且開始檢查插件版本,有新版本就下載下來,然后預(yù)加載,下一次打開就是最新的版本了。

效果圖.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("打開祈福明燈插件");
}
});
}
看代碼,有三個監(jiān)聽,第一個onInstalling,是下載插件進度,在這里更新UI進度條。第二個onFail,是下載或者安裝插件失敗,在這里做一個提示。第三個是onSuccess,無論是初次還是第二次打開,打開插件Activity都會回調(diào)到這里的。
那封裝的類如下:
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)) {//判斷是否已經(jīng)安裝,安裝了的話,就打開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) {//判斷,是否為更新,如果是更新就預(yù)加載,下次打開就是最新的插件,不是更新就開始安裝
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) {
//獲取文件存儲權(quán)限
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等等下載都行,然后在回調(diào)中處理那幾個方法就行
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 可帶參數(shù)傳遞
*
* @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 帶回調(diào)
*
* @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();
}
}
這樣就可以實現(xiàn)外置插件的下載更新打開邏輯,根據(jù)自己的實際情況修改下就能用到項目中了吧