42

我有一个 Android 库项目,我想在另一个 Android 项目中使用它。

该库在其 AndroidManifest 中声明了一个 Activity。当我在第二个项目中尝试以下操作时:

        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" />

但它仍然不起作用

4

8 回答 8

41

我相信您必须将 <activity> 包含在您自己的 AndroidManifest.xml 中——我不认为它是从库中获取的。我没有方便的参考资料。

更新:这是官方解决方案。从文档

在清单文件中声明库组件

在应用程序项目的清单文件中,您必须添加应用程序将使用的从库项目导入的所有组件的声明。例如,您必须声明任何 <activity><service><receiver><provider>等,以及 <permission><uses-library>和类似元素。

声明应在适当的情况下通过其完全限定的包名称引用库组件。

于 2011-05-27T21:00:12.303 回答
21
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName("packagename//ex-com.hello", 
                                     "classname//ex-com.hello.ExampleActivity"));
startActivity(intent);

并确保您在图书馆中声明了这些活动。您无需在当前项目的清单中声明库活动。

于 2012-03-22T12:27:29.620 回答
4

你添加到清单了吗?

http://developer.android.com/guide/topics/manifest/uses-library-element.html

于 2011-05-27T21:00:25.793 回答
3

这有效:

在您的库中,放置您的自定义Activity

public class MyLibraryActivity extends ListActivity { ... }

无需将其放入清单中。在您调用的 Android 项目中,创建一个空(虚拟)包装器:

public class MyActivity extends MyLibraryActivity { } 

并将对此类的引用添加到您的清单中:

<activity android:name="my_package.MyActivity" ... />
于 2012-01-25T21:01:11.470 回答
1

我知道这个问题已经很老了,但我认为这可能会帮助像我这样遇到同样问题的人。

使用 Eclipse,在库之间共享代码和活动的最佳方式可能是可以在此处的 android 文档中找到的方式:

使用 ADT 从 Eclipse 管理项目

于 2012-04-25T16:57:27.793 回答
1

在库中使用活动时,应仅在库的清单中声明该活动。活动可以从主应用程序启动,如下所示:

  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);
于 2020-09-15T21:47:02.960 回答
0

你应该只导入活动的代码(而不是清单),然后在你的第二个项目的清单中声明你的活动(库的)

于 2011-05-27T21:02:28.027 回答
0

如果您在启动库的活动时使用以下代码在库的清单中添加了活动,则不需要在主项目的清单中显式添加活动。

对于科特林

   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);
于 2018-09-24T10:33:12.710 回答