Использование проекта библиотеки Android Активность в другом проекте
У меня есть проект библиотеки Android, который я хотел бы использовать из другого проекта Android.
У библиотеки есть активность, объявленная в AndroidManifest. Когда я попробую следующее во втором проекте:
Intent intent = new Intent(this, ReaderActivity.class);
startActivity(intent);
Я получаю следующее исключение:
java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.digitalpages.reader.demo/br.com.digitalpages.reader.demo.ReaderDemoActivity}: android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
...
Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
...
Как я могу открыть активность из другого проекта?
РЕДАКТИРОВАТЬ: По ответам пользователей я добавил следующую строку в мой второй проект
<uses-library android:name="br.com.digitalpages.reader" android:required="true" />
Но это все еще не работает
7 ответов
Я полагаю, что вы должны включить
Обновление: это официальное решение. Из документа:
Объявление компонентов библиотеки в файле манифеста
В файле манифеста проекта приложения необходимо добавить объявления всех компонентов, которые будет использовать приложение, которые импортированы из проекта библиотеки. Например, вы должны объявить любой
<activity>
,<service>
,<receiver>
,<provider>
и так далее, а также<permission>
,<uses-library>
и аналогичные элементы.Объявления должны ссылаться на компоненты библиотеки по их полностью определенным именам пакетов, где это уместно.
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName("packagename//ex-com.hello",
"classname//ex-com.hello.ExampleActivity"));
startActivity(intent);
И убедитесь, что в библиотеке вы заявили о своей деятельности. Вам не нужно объявлять действия библиотеки в манифесте вашего текущего проекта.
Вы добавили в манифест?
http://developer.android.com/guide/topics/manifest/uses-library-element.html
Это работает:
В вашей библиотеке поместите свой кастом Activity
:
public class MyLibraryActivity extends ListActivity { ... }
Не нужно вносить это в манифест. В вашем вызывающем проекте Android создайте пустую (фиктивную) оболочку:
public class MyActivity extends MyLibraryActivity { }
и добавьте ссылку на этот класс в свой манифест:
<activity android:name="my_package.MyActivity" ... />
Вы должны импортировать только код действия (не манифеста тоже), а затем объявить свою активность (библиотеки) в манифесте вашего второго проекта.
При использовании действия внутри библиотеки действие должно быть объявлено только внутри манифеста библиотеки. Активность можно запустить из основного приложения следующим образом:
Intent intent = new Intent();
intent.setClassName(this, "com.duna.remotelocklibrary.activities.MainRemoteActivity");
startActivity(intent);
Я попытался запустить работу библиотеки, как в следующем коде, но предупреждаю: не работает
Intent intent = new Intent();
intent.setClassName("com.duna.remotelocklibrary", "com.duna.remotelocklibrary.activities.MainRemoteActivity");
startActivity(intent);
Я знаю, что вопрос довольно старый, но я думаю, что это может помочь таким людям, как я, которые столкнулись с той же проблемой.
Используя Eclipse, лучший способ поделиться кодом и действиями между библиотеками - это, вероятно, тот, который можно найти в документации по Android здесь:
Вам не нужно явно добавлять действие в манифест вашего основного проекта, если вы уже добавили действие в манифест своей библиотеки, используя следующий код при запуске действия библиотеки.
Для Котлина
val myIntent = Intent(activityContext, ActivityToLaunch::class.java)
// Needed to set component to remove explicit activity entry in application's manifest
myIntent.component = ComponentName(activityContext, PickerActivity::class.java)
activityContext.startActivity(myIntent, PICKER_REQUEST_CODE)
Для Java
Intent myIntent = new Intent(activityContext, PickerActivity.class);
// Needed to set component to remove explicit activity entry in application's manifest
final ComponentName component = new ComponentName(activityContext, PickerActivity.class);
myIntent.setComponent(component);
activityContext.startActivity(myIntent, REQUEST_CODE);