Android插件开发 —— 打开插件的Activity(预注册方式)
1. 前言
据上一篇博客《Android插件开发 —— 基础入门篇》中所讲的,我们可以用DexClassLoader加载插件中的类。但如果就这样打开插件中的Activity是无法打开的。这一篇博客主要讲如何打开插件中的Activity。开发工具为Android Studio。
2. 尝试打开插件中的Activity
1. 新建一个插件接口Module,名为PluginSDK
Module类型为Android Library。
包名为:zhp.android.plugin.sdk
定义一个接口,IPlugin.java:
package zhp.android.plugin.sdk;
import android.app.Activity;
/**
* 供宿主程序和插件使用的接口
*/
public interface IPlugin {
/**
* 供宿主回调的方法
*/
void execute(Activity activity);
}
2. 新建一个宿主Module,名为PluginHost
Module类型为Phone&Tablet module。
包名为:zhp.android.plugin.host
添加对PluginSDK的依赖。(如果不会用Android Studio添加依赖Module,参见上一篇博客)。
新建一个Activity名为MainActivity:
package zhp.android.plugin.host;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.File;
import dalvik.system.DexClassLoader;
import dalvik.system.PathClassLoader;
import zhp.android.plugin.sdk.IPlugin;
/**
* 宿主程序的MainActivity
* @author 郑海鹏
* @since 2015/11/17 19:13
*/
public class MainActivity extends AppCompatActivity {
DexClassLoader classLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initClassLoader();
}
/**
* 初始化classLoader
*/
private void initClassLoader() {
// 插件放在sd卡的根目录下
String apkPath = Environment.getExternalStorageDirectory() + File.separator + "plugin.apk";
// dex文件的释放目录
File releasePath = getDir("dexs", 0);
// 类加载器
classLoader = new DexClassLoader(apkPath, releasePath.getAbsolutePath(), null, getClassLoader());
}
/**
* 点击按钮以后打开插件
*/
public void onClick(View view){
openPlugin();
}
/**
* 打开插件
*/
private void openPlugin(){
try{
// 加载插件的入口类,并实例化出一个对象,回调execute()方法。
Class<?> pl