android.content.ActivityNotFoundException:
Posted
技术标签:
【中文标题】android.content.ActivityNotFoundException:【英文标题】:android.content.ActivityNotFoundException: 【发布时间】:2011-03-26 21:57:56 【问题描述】:我在尝试从另一个活动中调用活动时遇到此异常。完整的例外是
无法找到显式活动类 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">
我错过了什么吗?
【问题讨论】:
【参考方案1】:也许您需要检查是否将新活动添加到 manifest.xml 文件中
例子:
<activity
android:name=".className"
android:label="@string/app_name" >
</activity>
【讨论】:
我已经有以下条目: 仍然没有运气:( @paypalcomp 看起来您已将完整的包名称添加到活动名称中。尝试删除它,使您的条目看起来像: @Corey 我发现使用主应用程序清单文件中使用的完整包名(指库)对我有用。 @user94154 我也是。出于某种原因,.ActivityClassName
表示法在独立运行中有效,但在通过 Intent 从不同的应用程序调用时无效。 +1 确认我没有产生幻觉。
由于某种原因,我遇到了类似的问题...没有什么真正起作用我试图用完整的包名称更改活动名称。试图以许多不同的方式调用意图。甚至尝试将其放入 try catch 中,如下所述。我不知道发生了什么【参考方案2】:
如果其他人遇到类似的事情并到达此帖子,我遇到的问题可能会为您节省一些时间。可能与 OP 的问题无关,但与 ActivityNotFound 异常有关。
我试图通过以下方式加载活动:
Intent intent = new Intent( this, class );
但是,即使我已经多次检查并重新检查代码,我仍然不断收到ActivityNotFoundException
。
我得到的这个异常实际上并不是由意图引起的,而是我在加载的活动中运行的一些代码引发了RuntimeException
。 (我的问题是由Typeface.createFromAsset()
引起的)
您可能在活动中遇到类似的 RuntimeException。
要查看是否是这种情况,请将您的意图代码放入 try catch 块中。像这样:
try
/* your code */
...
catch ( ActivityNotFoundException e)
e.printStackTrace();
再次运行您的应用,并检查您的 LogCat,如果是同样的问题,您将收到带有“Caused By:”条目的 RuntimeException,指向您的实际问题。
我花了一个小时试图弄清楚这一点。希望这可以节省一些时间。
【讨论】:
谢谢!注释掉目标活动中的 onCreate 活动使问题消失。显然,人们需要接受建议,用一粒盐仔细检查清单。【参考方案3】:您正在调用的活动不仅应该出现在它自己的包的清单中,还应该出现在 CALLING 包的清单中。
【讨论】:
你的意思是如果我将一个项目作为库项目导入我的工作区,我也应该将库项目中清单中的<activity>
元素复制到我的项目清单中吗?跨度>
【参考方案4】:
从清单中删除您的活动,然后重新添加。此类型不直接写入 XML 类型。相反,请转到 Application > Application nodes > add
,选择 Activity,然后浏览文件源。
这对我有用。
【讨论】:
奇怪的错误,这为我修复了它:)【参考方案5】:intent.setClass 将参数作为“包上下文”和“类”。 一个例子是:
intent.setClass(CurrentActivity.this, TargetActivity.class);
您还需要检查活动是否已在清单文件中注册。
【讨论】:
【参考方案6】:添加了一个新活动并在 manifest.xml 中定义它,但我仍然收到“无法找到显式活动类”错误。我正在使用 Eclipse。我的问题的解决方案是“清理”项目。从 Eclipse 的主菜单:Project|Clean.... 然后选择您的项目并清理它。
【讨论】:
【参考方案7】:嘿,你需要使用另一种形式的 Intent 构造函数。这肯定会在一秒钟内解决您的问题:
例子:
Intent inte=new Intent(getBaseContext(),"your class name with .class extension ");
startActivity(inte);
这很好用,我检查了这段代码,它工作正常。
【讨论】:
【参考方案8】:当我在另一个类(作为内部类)中实现 Activity 时,我遇到了 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);
//...
在manifest里面声明如下:
<activity android:name=".Pref.Activity"
...
在将其声明为普通类(公共类 PrefActicity)并相应地更改清单后,它照常工作。
【讨论】:
【参考方案9】:我使用getActivityContext()
(而不是Activity.this
)作为菜单代码以节省一些工作,并将其复制并粘贴到每个活动中,而无需每次都进行编辑。
我将它们替换为Activity.this
,问题就消失了。
我有一种感觉,一个更聪明的 Android 人可以解决这个问题,而不必这样做。想听听会是什么。
【讨论】:
【参考方案10】:查看文档 here 你想要的是:
intent.setClassName("com.x.y", "className");
【讨论】:
感谢您的快速回答 :) .. 但我正在使用 Intent 类的以下方法“setClassName(String packageName, String className)”。我的清单文件包含以下条目: 我应该添加任何意图过滤器吗?我正在使用以下代码创建我的意图: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setClassName("com.x.y", className.class.getName()); activity.startActivity(intent); 我相信您需要在清单中的活动标签之间添加重新启动 Eclipse 并再次检查您的清单文件。如果您发现缺少相应的活动,请添加并重试。它解决了我的类似问题。
【讨论】:
【参考方案12】:除了米娜的回答。 当您将活动声明为内部静态类时,您应该将活动写入清单中,例如 ...
<activity android:name=".app.FragmentLayoutSupport$DetailsActivity" />
这里的.app来自你的包名,可以是.helpers.afdfa$afda
【讨论】:
【参考方案13】:我对此错误的解决方案是在清单中的名称前面添加一个包名称。
我有以下活动:
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>
【讨论】:
【参考方案14】:是的,我也遇到了这个问题。我刷新了项目。然后,一切正常。
【讨论】:
【参考方案15】:当我有同样的问题时。如果您正在使用库类文件并将其写入 android 清单文件,请将其写入,然后删除库项目清单文件这部分>> 那么它绝对可以工作..
【讨论】:
【参考方案16】:如果您在应用中包含库并且库正在调用库项目中定义的活动,也会发生此异常。在这种情况下,我们需要将库的清单与调用应用程序的清单合并。
使用 ADT 版本 20,我们可以通过在调用应用的 project.properties 中添加以下语句来做到这一点。
manifestmerger.enabled=true
【讨论】:
【参考方案17】:查看项目 bin 文件夹中的 Android Manifest File 的内容。当您的应用程序被编译和打包时,清单文件将被复制到 bin 文件夹中。就我而言,bin 文件夹中的 Manifest 与原始 Manifest 不一致。这可能是 Eclipse 的错误。我手动将 Manifest 复制到 bin 文件夹中,它工作正常。
【讨论】:
【参考方案18】:您可以将此代码添加到manifiest.xml
文件中
action android:name="com.kaushalam.activity101activity.SecondActivity"
category android:name="android.intent.category.DEFAULT"
【讨论】:
【参考方案19】:我也遇到了同样的情况。看了pearson的回答,修改了我的Activity,发现我写了
public void onCreate(Bundle s)
但其实应该是的
protected void onCreate(Bundle s)
现在可以使用了!
【讨论】:
【参考方案20】:如果您有一个 Activity 对象(您需要启动它),则此方法有效:
intent.setClassName(CallingActivity.this, activityToLaunch.getComponentName().getClassName());
【讨论】:
【参考方案21】:您调用的活动不应包含“sheme”并且包含意图过滤器:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.sj.myapplication.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
所以在调用代码中:
Intent intent=new Intent("com.example.sj.myapplication.SecondActivity");
startActivity(intent);
【讨论】:
【参考方案22】:尝试使用以下方法:
intent.setClassName("com.x.y", "com.x.y.className");
这对我有用
【讨论】:
【参考方案23】:我还通过将错误的视图传递给 setContentView() 遇到了 ActivityNotFoundException,每个活动的类文件必须以这种方式与布局 xml 文件相对应。
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.wrongView);
相对
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.correctView);
【讨论】:
【参考方案24】:我有同样的问题。我尝试了所有方法,但后来我整理出来的错误是双引号和我的类名之间有一个空格。它一定要是:
intent.setClassName("com.x.y","com.x.y.className")
不是
intent.setClassName("com.x.y"," com.x.y.className")
【讨论】:
以上是关于android.content.ActivityNotFoundException:的主要内容,如果未能解决你的问题,请参考以下文章