前言:
- 支付宝中有各种应用例如各种共享单车等,他们并不是直接集成在支付宝app中(也不可能)
- 那他们是怎么加载如此之多的应用的呢?
- 当然可以嵌入h5网页实现,但是h5的用户体验和兼容性当然没有原生的好,经过观察这些第三方应用都不是h5页面
- 那么问题来了,这些应用是如何加载到支付宝上的呢?
- 答案是:支付宝动态加载了第三方apk应用
原理:
- 如果我们能访问到第三方apk文件的类、资源文件,是不是就可以直接在主app加载出来,实现第三方app的功能呢?
- 答案是肯定的,但是在第三方app中,呈现的是一个个Activity,他又通过生命周期进行各种管理
- 那么主app能直接调用第三方自带生命周期的Activity类吗?很可惜是不能的
- 主app的生命周期是android系统赋予的,而我们使用主app直接加载第三方类的时候并不存在生命周期,所以我们需要自己赋予他生命周期
目标:
- 加载第三方apk文件的类、资源
- 赋予Activity类生命周期
步骤:
-
首先我们创建个PluginManager libs模块 主工程和插件工程都需要依赖他(主要实现资源和类的加载和管理)他包含一下几个类:
public class PluginApk { //插件实体对象 //包信息 private PackageInfo mPackageInfo; //资源对象 private Resources mResources; //asset对象 private AssetManager mAssetManager; //类加载器 private ClassLoader mClassLoader; public PluginApk(PackageInfo mPackageInfo, Resources mResources, ClassLoader mClassLoader) { this.mPackageInfo = mPackageInfo; this.mResources = mResources; this.mAssetManager = mResources.getAssets(); this.mClassLoader = mClassLoader; } public PackageInfo getmPackageInfo() { return mPackageInfo; } public Resources getmResources() { return mResources; } public AssetManager getmAssetManager() { return mAssetManager; } public ClassLoader getmClassLoader() { return mClassLoader; } }
public class PluginManager { private final static PluginManager mInstance=new PluginManager(); private PluginManager(){ } public static PluginManager getmInstance() { return mInstance; } private PluginApk pluginApk; private Context mContext; public void init(Context context){ //初始化上下文 mContext=context.getApplicationContext(); } public void loadApk(String apkPath){ //读取第三方apk的包信息 PackageInfo packageInfo= mContext.get