在这个案例中,使用常规的startActivity启动一个未安装apk中的Activity,需要解决以下几个问题:
1、 ClassLoader如何找到需实例化Activity
2、 未在androidmanifest.xml中注册如何启动对应Activity
3、 Activity生命周期怎么实现
4、 资源如何加载
1、 ClassLoader如何找到需实例化Activity
ActivityThread中的performLaunchActivity中实例化Activity:
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
这里看到ClassLoader相信大家已经明白Activity实例怎么来的了,没错,就是通过反射。这里重点看下这个ClassLoader怎么来的,这样也许我们可以通过它干点事情。这个ClassLoader实际是在LoadedApk中创建的,如下:
mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip,
mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
libraryPermittedPath, mBaseClassLoader,
mApplicationInfo.classLoaderName);
一直跟踪代码,最终找到ClassLoader创建的地方:
public static ClassLoader createClassLoader(String dexPath,
String librarySearchPath, ClassLoader parent, String classloaderName) {
if (isPathClassLoaderName(classloaderName)) {
return new PathClassLoader(dexPath, librarySearchPath, parent);
} else