Использование проекта библиотеки 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 ответов

Решение

Я полагаю, что вы должны включить в свой собственный AndroidManifest.xml - я не думаю, что он будет взят из библиотеки. У меня нет справки по этому поводу.

Обновление: это официальное решение. Из документа:

Объявление компонентов библиотеки в файле манифеста

В файле манифеста проекта приложения необходимо добавить объявления всех компонентов, которые будет использовать приложение, которые импортированы из проекта библиотеки. Например, вы должны объявить любой <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);

И убедитесь, что в библиотеке вы заявили о своей деятельности. Вам не нужно объявлять действия библиотеки в манифесте вашего текущего проекта.

Это работает:

В вашей библиотеке поместите свой кастом 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 здесь:

Управление проектами из Eclipse с помощью ADT

Вам не нужно явно добавлять действие в манифест вашего основного проекта, если вы уже добавили действие в манифест своей библиотеки, используя следующий код при запуске действия библиотеки.

Для Котлина

   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);
Другие вопросы по тегам