android.content.ActivityNotFoundException:

21

在我尝试从一个活动中调用另一个活动时,我遇到了这个异常。完整的异常信息如下:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.x.y / com.x.y.class};

我正在执行 intent.setClass("com.x.y", "com.x.y.className") 操作,其中 className 是我的活动类的名称,而 com.x.y 是它所在的包名。

我的 AndroidManifest.xml 文件具有以下内容:

<activity android:name="com.x.y.className" android:label="@string/app_name">

我有遗漏什么吗?

24个回答

34
也许你需要检查是否已将新的活动添加到manifest.xml文件中。
示例:
<activity
      android:name=".className" 
      android:label="@string/app_name" > 
</activity>

我已经有了以下条目:<activity android:name="com.x.y.className" android:label="@string/app_name"> </activity>仍然没有运气 :( - sharath
@paypalcomp 看起来您在活动名称中添加了完整的包名。尝试将其删除,使您的输入看起来像:<activity android:name=".className" android:label="@string/app_name"> </activity> - Corey Sunwold
1
@Corey,我发现在主应用程序的清单文件中使用库的完整包名称对我很有效。 - user94154
@user94154 我也是。由于某种原因,.ActivityClassName 符号在独立运行时有效,但是通过 Intent 从不同的应用程序调用时无效。+1 确认我没有幻觉。 - Bill The Ape
由于某种原因,我遇到了类似的问题... 什么都不起作用,我尝试使用完整包名更改活动名称。 尝试以许多不同的方式调用意图。 甚至尝试将其放在try catch中,如下所述。 我不知道发生了什么。 - zulu_papa

16

如果其他人遇到类似的问题并进入了这篇文章,我遇到的一个问题可能会为您节省一些时间。它可能与原始问题无关,但与ActivityNotFound异常有关。

我试图使用以下方式加载一个活动:

Intent intent = new Intent( this, class );

尽管我已经多次检查了代码,但仍然不断地遇到ActivityNotFoundException异常。

实际上,导致这个异常的原因并不是intent,而是在加载的activity中运行的某些代码抛出了RuntimeException。(我的问题是由Typeface.createFromAsset()引起的)

你可能也遇到了类似的RuntimeException。

为了查看是否存在这种情况,请将intent代码放入try catch块中。就像这样:

try {
    /* your code */
    ...
} catch ( ActivityNotFoundException e) {
    e.printStackTrace();
}

重新运行您的应用程序,并检查您的LogCat,如果出现相同的问题,则会获得一个RuntimeException,其中包含指向实际问题的"Caused By:"条目。

我花了一个小时来解决这个问题。希望这可以节省其他人的时间。


谢谢!在目标活动中注释掉onCreate活动使问题消失了。显然,人们需要带着一点怀疑的态度来遵循双重检查清单的建议。 - cayhorstmann

14

你所调用的活动应该不仅出现在自己包的清单文件中,还应该出现在调用方的清单文件中。


你的意思是,如果我将一个项目作为库项目导入到我的工作区中,我还应该将库项目中的<activity>元素从清单复制到我的项目的清单中吗? - Solace

8

从清单中删除您的活动,然后再次添加它。这种类型不直接编写XML,而是转到 应用程序 > 应用程序节点 > 添加,选择活动,然后浏览文件源。

这对我有用。


奇怪的错误,这个解决了,谢谢 :) - fuzzy dunlop

3

intent.setClass需要两个参数:"包上下文"和"类名"。以下是一个例子:

intent.setClass(CurrentActivity.this, TargetActivity.class);

同时,您还需要检查活动是否在清单文件中注册。

2

我添加了一个新的活动并在manifest.xml中定义了它,但仍然收到“找不到明确的活动类”错误。我正在使用Eclipse。解决我的问题是“清理”项目。从Eclipse的主菜单中:Project | Clean.... 然后选择你的项目并进行清理。


1

我在将一个Activity作为内部类(inner class)实现时遇到了ActivityNotFoundException的错误:

//... inside the utility class Pref
public static class Activity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }
}
//...

在清单文件中声明如下:

<activity android:name=".Pref.Activity"
...

在将其声明为普通类(public class PrefActicity)并相应更改清单后,它像往常一样工作。

1

嘿,你需要使用另一种Intent构造函数。这肯定会在一秒钟内解决你的问题:

示例:

Intent inte=new Intent(getBaseContext(),"your class name with .class extension ");

startActivity(inte);

这个代码完美运行,我已经检查过了,它能够正常工作。


1

我曾经在菜单代码中使用getActivityContext()(而不是Activity.this),以节省一些工作量,并将其复制粘贴到每个活动中,而无需每次都进行编辑。

我用Activity.this替换了它们,问题就解决了。

我有一种感觉,更聪明的Android开发者可以绕过这个问题。想听听他们的建议。


0

我解决这个错误的方法是在清单文件中的名称前面添加包名。

我有以下活动:

  • id.scanner.main.A1

  • id.scanner.main.gallery.A2

我的清单文件包含以下内容:

<activity android:name=".A1" ....></activity>
<activity android:name=".A2" ....></activity>

这解决了问题:

<activity android:name=".A1" ....></activity>
<activity android:name="gallery.A2" ....></activity>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接