我在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的基础吗?
答案 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()
。