Проблема: Служба, называемая PdService, «не найдена» во время выполнения, когда я отправляю Намерение связать его с Деятельностью.
[Редактировать: Решение]
Я не совсем ясен в вопросах, связанных с решением, однако решение найдено. Когда я экспортирую JAR моего основного проекта (который связан с проектом библиотеки Android), я выбираю опцию включения проекта библиотеки в JAR. Это решило проблему.
Теперь, это странно, потому что исходный код из связанного проекта явно превращал его в JAR еще до этого, он просто не "находился" во время выполнения Android. Но по какой-то причине явное включение всего связанного проекта устранило эту проблему. Это также неудачный обходной путь, потому что теперь мне нужно включить в JAR гораздо больше контента, чем я хочу, но пока проблема решена.
[Исходные сведения о проблеме]
подробности:
- Приложение представляет собой приложение AIR for Android (.SWF + OTHER_STUFF -> .APK)
- Java-код (включая PdService) был упакован в Собственное расширение AIR (.ane)
- Намерение для PdService происходит в нашем пользовательском FREContext (см. Собственные расширения AIR), который мы назвали PdContext, в частности, в методе init ().
- Для полноты я включил тег для PdService как в манифест Android для расширения, так и в файл application.xml приложения AIR.
- Имя пакета расширения: com.nichemobile.pd.pdextension
- Путь к классу PdService: org.puredata.android.service.PdService
- Идентификатор приложения конечного пользователя (AIR ID): com.nichemobile.pdextension.testapp
Я пробовал несколько комбинаций Интентов, в том числе (это действие является ссылкой на выполняемое действие):
bindIntent.setClassName(thisActivity, "org.puredata.android.service.PDService");
bindIntent.setClassName(thisActivity, ".org.puredata.android.service.PDService");
bindIntent.setClassName(thisActivity, "..org.puredata.android.service.PDService");
bindIntent.setClassName("org.puredata.android.service", ".org.puredata.android.service.PDService");
bindIntent.setClassName("org.puredata.android.service", "org.puredata.android.service.PDService");
bindIntent.setClassName("", "org.puredata.android.service.PDService");
bindIntent.setClassName(".", "org.puredata.android.service.PDService");
Каждое намерение приводит к ошибке времени выполнения, утверждая, что служба "не найдена". У кого-нибудь есть идеи как это исправить?
Исходя из моего понимания Intents for Services, два параметра ДОЛЖНЫ быть:
пакет: air.com.nichemobile.pdextension.testapp
класс: org.puredata.android.service.PDService
Но, конечно, это не сработало выше в самом первом примере.
Моя текущая теория:
После проверки файла classes.dex в скомпилированном APK я обнаружил, что в корне этого файла classes.dex есть 3 подкаталога:
- air.com.nichemobile.pdextension.testapp (содержит активность AppEntry)
- com (содержит наше расширение классов Java)
- org.puredata (содержит все классы PD, включая PdService)
Мне интересно, не может ли приложение найти Службы, потому что они существуют за пределами каталога "air.com.nichemobile.pdextension.testapp" в файле classes.dex. Теперь приложение может выполнять код в классах в каталогах / com и /org.puredata, но мне интересно, не мешает ли каким-то образом процессу запуска службы на платформе Android эта структура классов в classes.dex файл.
В качестве несколько запутанного примера того, о чем я говорю выше - строка, перед которой я пытаюсь связать этот сервис, могу сказать:
Log.d(TAG, "PdService package: " + PdService.class.getPackage());
Log.d(TAG, "PdService class name: " + PdService.class.getName());
и я получаю вывод:
PdService package: package org.puredata.android.service
PdService class name: org.puredata.android.service.PdService
Любое разъяснение здесь будет оценено.
Спасибо.
Мэтт