本文我们将以一个工程为例,验证拦截Activity启动的可行性,我们的目标是将普通的APK当做插件加载起来,不做任何修改,插件内Activity跳转也没有任何问题。这个APK自然是没有安装的,但是可以安装后正常独立运行。
首先新建插件工程,和正常APP一般无二,没有任何特别的地方。所有的Activity都是从android.app.Activity继承,可以安装并独立运行。
接下来新建宿主工程,并将插件Apk用adb push到宿主的插件目录下,稍后宿主会扫描并解析这个目录下的所有插件。先给出宿主的入口Activity,如下:
public class MainActivity extends Activity {
private File mRoot;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRoot = getExternalFilesDir("plugin");
if (!mRoot.exists() && !mRoot.mkdirs()) {
throw new IllegalStateException("plugin dir invalid");
}
try {
scanAllPlugins();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mBtn = (Button) findViewById(R.id.btn);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
launchApk("com.example.plugin");
}
});
}
private void scanAllPlugins() throws Exception {
File[] files = mRoot.listFiles();
if (files != null) {
for (File file : files) {
PluginManager.installPlugin(this, file);
}
}
}
private void launchApk(String packageName) {
ComponentName component = PluginManager.getLauncherComponent(packageName);
Intent intent =