2010-07-31 4 views
2

У меня есть абстрактный вид в Android-библиотеке (AbstractActivity), который предполагается использовать в других приложениях как базовая.Абстрактные классы в Android-библиотеке

Поскольку это действие не должно использоваться напрямую, оно не объявляется в библиотеке AndroidManifest.xml-файла (реальная причина в том, что активность объявлена ​​как абстрактная), и поэтому я не могу объявить ее в приложения 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 [email protected] 

Могу ли я ссылаться на абстрактную активность, объявленный в библиотеке и использовать его в качестве основы для деятельности в проекте, который ссылается на эту библиотеку?

+0

Я как раз собирался задать этот вопрос сам. – el2iot2

ответ

4

Развертывание отдельных APK, вероятно, не требуется. APK живут в разных песочницах и не могут получить доступ друг к другу.

Если вы хотите повторно использовать код, создать проект для Android библиотеки (в Eclipse, откройте свойства вашего проекта библиотеки, выберите Android и проверить «Является ли библиотека» в разделе библиотеки.

Затем, ссылки на библиотеку по нажав на кнопку «Добавить» в разделе библиотеки в проектах, которые используют эту библиотеку.

Вы в конечном итоге с одним APK тогда.

+0

Я принимаю этот ответ, потому что так я это делаю прямо сейчас. По какой-то причине, когда я развернул приложение через Eclipse, в устройстве было два APK (один для библиотеки и другой для самого приложения). Очистка проекта и обновление ADT устранили проблему. – foliveira

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().

+0

Я принимаю Ответ Майкла, потому что это был правильный способ делать то, что я хотел. Я не собирался одновременно иметь два APK на устройстве для этого конкретного случая, но ваше предложение получило замечание и может пригодиться в будущем. помощь. – foliveira

Смежные вопросы