跨App调用带返回结果的Activity时Manifest文件该如何配置?
调用方(第一个应用)Manifest修改
如果你的应用targetSdkVersion ≥ 30(适配Android 11及以上系统),需要在<manifest>根节点(与<application>节点同级)添加包可见性声明,否则无法正常获取到第二个应用的启动Intent:
<manifest ...> <!-- 新增如下queries节点 --> <queries> <package android:name="a1.a1.gerufen3" /> </queries> <application ...> ... </application> </manifest>
如果targetSdkVersion < 30,调用方Manifest无需额外修改。
被调用方(第二个应用,包名a1.a1.gerufen3)Manifest修改
你需要确保被调用的目标Activity满足以下配置:
- 目标Activity的
android:exported属性显式设置为true,允许外部应用启动该组件。如果应用targetSdkVersion ≥ 31,该属性必须显式声明,不能省略。 - 如果你是通过自定义action隐式启动目标Activity而非直接用包名启动,还需要为目标Activity添加匹配的
<intent-filter>配置。
如果你调用的是第二个应用的启动页Activity,默认的启动页配置已经包含LAUNCHER类别的intent-filter,仅需确保android:exported="true"即可,示例配置:
<activity android:name=".YourTargetActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
额外注意事项(非Manifest配置,但会直接影响结果返回)
通过getLaunchIntentForPackage()获取的Intent默认会携带FLAG_ACTIVITY_NEW_TASK标记,该标记下启动的Activity无法返回结果给调用方,你需要手动移除该标记:
val pack = "a1.a1.gerufen3" val unter = packageManager.getLaunchIntentForPackage(pack)!! unter.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 新增该行代码 secondActivityWithResult.launch(unter)
同时被调用方的目标Activity需要在关闭前调用setResult(RESULT_OK, intent)设置返回数据,否则调用方收到的结果码会默认是RESULT_CANCELED。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

