在另一个项目中使用Android库项目Activity

时间:2011-05-27 20:57:11

标签: android android-activity android-library

我有一个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" />

但它仍然不起作用

8 个答案:

答案 0 :(得分:35)

我相信你必须包含&lt; activity&gt;在你自己的AndroidManifest.xml中 - 我认为它不会从库中获取。我没有这方面的参考。

更新:这是官方解决方案。来自the doc

  

在清单文件中声明库组件

     

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

     

声明应该通过它们来引用库组件   完全合格的包名称。

答案 1 :(得分:19)

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName("packagename//ex-com.hello", 
                                     "classname//ex-com.hello.ExampleActivity"));
startActivity(intent);

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

答案 2 :(得分:4)

这有效:

在您的资料库中,添加自定义Activity

public class MyLibraryActivity extends ListActivity { ... }

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

public class MyActivity extends MyLibraryActivity { } 

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

<activity android:name="my_package.MyActivity" ... />

答案 3 :(得分:3)

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

Managing Projects from Eclipse with ADT

答案 6 :(得分:0)

如果您已经在启动库活动时通过使用以下代码在库清单中添加了活动,则无需在主项目清单中显式添加活动。

对于Kotlin

   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);

答案 7 :(得分:0)

在库中使用活动时,应仅在库清单中声明该活动。 可以像这样从主应用程序开始活动:

  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);