2010-07-31 30 views
2

我在Android庫中有一個抽象活動(AbstractActivity),它應該在其他應用程序中用作基本活動。Android庫中的抽象類

由於本活動不應該直接使用,它不會在庫AndroidManifest.xml文件中聲明(真正的原因是因爲活動被聲明爲抽象的),所以我不能聲明它在應用程序AndroidManifest.xml文件。

真正的問題是,當我創建使用庫的應用程序中,兩個.apk文件的文件部署到該設備,Library.apkApplication.apk,當Application.apk啓動它

ERROR/AndroidRuntime(4709): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{foo.bar/foo.bar.ApplicationActivity}: java.lang.ClassNotFoundException: foo.bar.ApplicationActivity in loader [email protected] 

我可以引用在一個庫中聲明一個抽象的活動,並在引用該庫項目中使用它作爲基地的活動:在logcat的以下信息結束?

+0

我正要自己問這個問題。 – el2iot2 2010-08-02 17:46:21

回答

4

部署單獨的APK可能不是你想要的。 APK存在於不同的沙箱中,無法互相訪​​問。

如果你想重用代碼,創建一個Android庫項目(在Eclipse中,庫項目的開放特性,選擇Android和檢查「是圖書館」下的庫部分。

然後,參考由圖書館點擊「添加」下,在使用這個庫中的項目庫部分。

你結束了一個單一的APK然後。

+0

我接受這個答案,因爲這是我現在正在做的方式。出於某種原因,當我通過Eclipse部署我的應用程序時,設備中有兩個APK(一個用於庫和另一個用於應用程序本身)。清理項目並更新到ADT可以解決問題。 – foliveira 2011-01-20 15:32:30

2

做到這一點,最好的(正確)的方法是使用該解決方案@邁克爾但是,爲了完整起見,我想我會提供另一種解決方案,以適應目前的情況如果由於某些原因你想避免將一個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()

+0

我接受邁克爾的回答是因爲這是做我想做的事情的正確方式,我不打算在這個特定情況下一次在設備上安裝兩個APK,但是您的建議會被注意到,並且可能在將來派上用場。幫助。 – foliveira 2011-01-20 15:34:53