我有一个仅在 API 33 上发生的错误。有什么变化吗?
我有两个应用程序:A 和 B。我们称它们为
com.example.a
和 com.example.b
。他们需要互相发动。从 API 33 开始,当应用程序 A 尝试启动应用程序 B 时,我得到:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.b/com.example.b.DefaultLaunchActivity}; have you declared this activity in your AndroidManifest.xml, or does your intent not match its declared <intent-filter>?
DefaultLaunchActivity
在应用程序 B 的清单中定义如下:
<activity
android:name="com.example.b.DefaultLaunchActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我还在应用程序 A 的清单中添加了以下内容(从 API 31 开始需要):
<queries>
<package android:name="com.example.b" />
</queries>
最后,应用程序 A 获取应用程序 B 的启动 Intent,如下所示:
val intent = application.packageManager.getLaunchIntentForPackage("com.example.b")?.apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
添加
Intent.FLAG_ACTIVITY_REQUIRE_NON_BROWSER
没有帮助。当应用程序 B 尝试启动应用程序 A 时,会出现相同的错误。
需要明确的是,上面的代码适用于 API 32,但不适用于 API 33。发生了什么变化?
是的,很多事情都改变了。
您必须在
manifest
文件包中明确定义您要调用的应用程序,例如:
<queries>
<package android:name="com.google.android.apps.translate"/>
</queries>
它是在 Android 11 (API 30) 中引入的。观察到的行为可能可以解释它是在 API 30 中引入的,但自 API 33 起强制执行。需要更多的研究来找出根本原因。