2017-06-06 59 views
0

从我的包中的类,我尝试在包B.启动活动android.content.ActivityNotFoundException:无法找到明确的活动课的时候调用StartActivity()

它工作正常,当我尝试这样:

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才能称为第二种方式。

尽管我已经提到了这个问题的所有相关循环,但没有找到解决方案。此外,我宣布我的表现像下面(否则我想它不会被通过第1种方法调用)OK:

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

请检查是否可能帮助?这两个软件包也是同一个App的一部分。

+0

你确定软件包名称是“com.example.package”吗?是不是你在gradle中改变它的给定变体? – Selvin

+0

你可以试试看:ComponentName.createRelative(“com.example.package”,“ClassB”); – X3Btel

+0

@Selvin是,双重保证.. –

回答

0

如果你在你的问题中写道一切是正确的,那么你的应用程序的应用程序ID不com.example.package。因此,更改:

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

到:

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

其中xxx是您的应用程序的应用程序ID。特别是,组件名称的右侧应该是清单中<activity>android:name值,左侧应该是应用程序的应用程序ID。您可以随时拨打getComponentName()进行一项活动,以查找其ComponentName(例如,登录LogCat以查看它的外观)。

然后,重新考虑这样做。虽然你写“你需要通过ComponentName调用第二条路”,但我想不出任何需要ComponentName的场景。

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

+0

工程完美..感谢CommonsWare为您提供帮助。然而,我对开发人员站点上的描述有些困惑,或者我缺少一些东西:FlattenToString 在API级别1中添加了 String flattenToString() 返回一个字符串,明确描述了ComponentName中包含的包和类名称。您可以稍后通过unflattenFromString(String)从此字符串中恢复ComponentName。 返回 字符串\t返回一个新的包含包和类名称的String。这表示为**包名称**,与“/”连接,然后是类名称。没有提及应用程序标识? –

+0

@SahilMehta android中的应用程序ID通常是包名 - 在测试用例'com.example.package'中 – X3Btel

+0

@ X3Btel是的,但根据我的情况,它也可能不同,所以可以指定应用程序ID可以让事情更清楚。 –

相关问题