最近一直没有写博客,本着罪恶感,写一篇吧。
这个功能最近项目中使用到了,因为代码比较臃肿,不是很方便。所以选择插件话,功能本社类似支付宝里面的共享单车等app加载功能。好处具体不说了,直接说下思路吧。
我的工程是app,想要加载的插件是plugin.apk。安卓机制是想要打开的activity必须进行注册才可以使用,那么怎么能加载第三方apk的activity呢?这里引入一个代理的proxyactivity,在app工程里面进行注册,所以我可直接进行使用proxyactivity,根据dexClassLoader加载class文件和反射机制,将pugin.apk资源文件和class文件都进行获取,值得注意的是plugin.apk的activity是没有生命周期的,所以要进行模拟生命周期,即在proxyactivity的onStart()方法里面同时给这个activity赋予声明周期信息。
好了,说下具体的思路吧,插件apk需要有一个标准接口,这个接口实现了生命周期。
public interface PluginInterface { public void attach(Activity ProxyActivity);//用来注册上下文 public void onCreate(Bundle savedInstanceState); public void onStart(); public void onResume(); public void onPause(); public void onStop(); public void onDestroy(); public void onSaveInstanceState(Bundle outState); public boolean onTouchEvent(MotionEvent event); public void onBackPressed();
}
实现一个插件管理类,这个类用来获得插件的资源信息等,这里属于重点,需要了解反射等知识。
public class PluginManager { final String TAG = "PluginManager"; private Context context; private DexClassLoader dexClassLoader;//加载外置卡class private static PluginManager instance; private Resources resources; public String entryName ;//入口 private PluginManager(Context con){