前言
在android中,A apk通过包名(pkg name)和类名(cls name)调用B apk的某个activity,但在实际调用过程中,A apk中调用startActivity时报了如下错误:
android.content.ActivityNotFoundException: Unable to find explicit activity class {[pkg name]/[cls name]}; have you declared this activity in your AndroidManifest.xml?
有可能是调用参数写错了。
方法
对于被调用的B apk:
需要在android manifest中声明你的activity名称,当然这一步是必做的,因为你不声明的话在B apk内部你也进不去这个activity。此外,需要对被调用的activity设置为导出,也就是这句android:exported="true"。例如:
<manifest
package="com.company.default">
<application
...
<activity
android:name=".DemoActivity"
android:exported="true" />
<activity
...
</application>
</manifest>
对于调用者的A apk:
用正确的pkg name和cls name创建一个intent,并通过startActivity()方法启动B apk中的activity即可。例如:
Intent intent = new Intent();
intent.setClassName("com.company.default", "com.company.default.DemoActivity");
startActivity(intent);
这里要注意,pkg name就是我们在android manifest中声明的package名称。cls name是包含包名和文件夹路径名称的完整的类名,例如包名为com.company.default,而在包名路径下,又创建了example文件夹,DemoActivity在example文件夹下,那么cls name为com.company.default.example.DemoActivity,如果只写了"DemoActivity",就会出现文章开头提示的ActivityNotFoundException。