前言
在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。