android.content.ActivityNotFoundException:调用StartActivity()时无法找到显式活动类

时间:2017-06-06 12:38:40

标签: android

从我的Package A类中,我尝试在Package B中启动Activity。

当我尝试这种方式时,它运作正常:

new Intent(getApplicationContext(), ClassB.class);

但是,当尝试通过这种方式创建Intent时:

ComponentName componentName = ComponentName.unflattenFromString("com.example.package/.ClassB");

它会出错:**android.content.ActivityNotFoundException:** Unable to find explicit activity class {};您是否已在AndroidManifest.xml中声明了此活动?我的问题是需要通过ComponentName将其称为第二种方式。

虽然我已经提到了这个问题的所有相关循环,但没有找到解决方案。我也在下面的清单中声明好了(否则我想它不会通过第一种方法调用):

<activity android:name="com.example.package.ClassB"
    android:exported="true"
    android:excludeFromRecents="true" />

请检查是否可以提供帮助?这两个包都是同一个App的一部分。

1 个答案:

答案 0 :(得分:0)

如果您在问题中写的所有内容都是正确的,那么您应用的应用ID就不是com.example.package。所以,改变:

ComponentName componentName = ComponentName.unflattenFromString("com.example.package/.ClassB");

为:

ComponentName componentName = ComponentName.unflattenFromString("xxx/com.example.package.ClassB");

其中xxx是您应用的应用ID。特别是,组件名称的右侧应该是清单中android:name的{​​{1}}值,左侧应该是应用程序的应用程序ID。您始终可以在活动上调用<activity>来查找其getComponentName()(例如,登录LogCat以查看其外观)。

然后,重新考虑做这些事情。当你写下你只需要通过ComponentName&#34;第二种方式调用它时,我想不出任何需要ComponentName的情况。

例如,假设您要将ComponentName的字符串表示保存在文件中。这是有风险的,因为这意味着您永远无法重构您的应用,否则您保存的ComponentName值将无效。相反,在表示逻辑活动的文件中保存一些内容,并将应用程序代码映射到正确的Java类,以便在显式ComponentName中使用。