Android库中的抽象类

时间:2010-07-31 20:21:28

标签: android

我在Android库( AbstractActivity )中有一个抽象活动,它应该在其他应用程序中用作基本活动。

由于此Activity不应该直接使用,因此它不会在库AndroidManifest.xml文件中声明(真正的原因是因为Activity被声明为abstract),因此我无法在应用程序AndroidManifest.xml文件。

真正的问题是,当我创建一个使用该库的应用程序时,会将两个.apk文件部署到设备, Library.apk Application.apk ,当Application.apk启动时,它会在LogCat中以下面的消息关闭:

ERROR/AndroidRuntime(4709): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{foo.bar/foo.bar.ApplicationActivity}: java.lang.ClassNotFoundException: foo.bar.ApplicationActivity in loader dalvik.system.PathClassLoader@44bec098

我可以引用在库中声明的抽象Activity并将其用作引用此库的项目中的Activity的基础吗?

2 个答案:

答案 0 :(得分:4)

部署单独的APK可能不是您想要的。 APK存在于不同的沙箱中,无法互相访​​问。

如果要重用代码,请创建一个Android库项目(在Eclipse中,打开库项目的属性,选择Android并选中库部分下的“Is Library”。

然后,通过单击使用此库的项目中的库部分下的“添加”来引用库。

然后你最终得到一个APK。

答案 1 :(得分:2)

最好(也是正确)的方法是使用@Michael建议的解决方案。但是,为了完整性,我想我会提供另一种解决方案,可以使用当前设置的两个apk文件,如果由于某种原因你想避免使一个apk成为一个库。另请注意,如果首先加载了AbstractActivity子类的活动,这将不起作用,这仅在子类被实例化或从同一应用程序中的另一个Activity调用时才有效。

在另一个Activity中,您可以实例化PathClassLoader,如此

PathClassLoader loader = new PathClassLoader("/data/data/com.yourlibrarypackage.apk", PathClassLoader.getSystemClassLoader());

然后用它来加载你想要的课程

loader.loadClass("com.yourpackage.YourAbstractActivity")

loadClass方法返回一个Class<T>对象,您可以忽略它,因为它具有使其可用于共享相同内存空间的其他类的副作用。该调用类似于Class.forName()

相关问题