【发布时间】:2017-11-07 22:56:11
【问题描述】:
对于一个长期的学生项目,我正在尝试开发一个带有插件的模块化应用程序。具体来说,我们会:
一个主应用程序,我们可以在其中搜索、更新、删除和运行插件。这个主应用程序还会存储来自插件的一些数据。
从 HTTP 服务器下载的几个插件,带有代码和 GUI 组件。
现在,我有一个主应用程序,它能够从 HTTP 下载一个 .apk 文件,并从这个 .apk 文件中定义的类创建一个新实例。我使用这里描述的方式:http://android-developers.blogspot.fr/2011/07/custom-class-loading-in-dalvik.html 和 DexClassLoader() 方法。
但我看不到如何显示作为资源存储在插件 .apk 文件中的布局(或任何其他 GUI 组件)。例如,我尝试使用插件类名从主应用程序创建一个 Intent,但没有成功:
DexClassLoader cl = new DexClassLoader(...);
Class<?> libClass = cl.loadClass("plugin_classname");
Intent intent = new Intent(this.getApplicationContext(), libClass);
startActivity(intent);
这不起作用,因为 Intent 没有在主应用程序的 AndroidManifest.xml 中声明。这在另一个线程中也有描述:Android- Using DexClassLoader to load apk file
这是否意味着绝对没有办法构建这样一个“动态”用户界面?更一般地说,这种类型的插件系统可以在Android上完成吗?我应该尝试其他方法吗?
【问题讨论】:
-
与其使 Activity 动态化,不如始终使用相同的 Activity 并使用 DexClassLoader 来加载片段。
-
你是如何打造你的
plugin.jar。实现接口的jar?我有一个由 Eclipse 构建的带有classes.dex条目的 jar,但loadClass总是抛出异常。