如何启动无界面Activity且不唤起应用后台已存在的Activity?
解决从通知启动对话框Activity时唤起后台Activity的问题
我之前也碰到过完全一样的情况,核心问题出在你启动的对话框Activity默认会加入应用的现有任务栈,导致系统把整个任务栈拉到前台,先显示栈顶的Activity才弹出对话框。可以通过以下两步彻底解决:
1. 给对话框Activity配置独立任务栈(Manifest中)
在你的无GUI Activity的Manifest配置里,添加taskAffinity=""(空字符串,让它不与应用其他Activity共享任务栈),同时设置无显示主题和排除最近列表:
<activity android:name=".CustomDialogActivity" android:theme="@android:style/Theme.NoDisplay" <!-- 无GUI必须设置这个主题 --> android:taskAffinity="" android:excludeFromRecents="true" />
2. 启动Intent添加关键FLAG组合
构建通知的PendingIntent时,给Intent加上这两个FLAG:
Intent dialogIntent = new Intent(context, CustomDialogActivity.class); // FLAG_ACTIVITY_NEW_TASK是从通知启动的必备项,FLAG_ACTIVITY_NO_HISTORY让Activity关闭后不留痕迹 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, dialogIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
额外补充
- 如果你不想修改Manifest的
taskAffinity,也可以尝试FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK,但这个会清空应用的整个任务栈(后台的其他Activity会被销毁),一般不推荐,除非你明确需要这种行为。 - 记得在对话框Activity的
onCreate里弹出对话框后,在对话框关闭的回调中调用finish(),配合FLAG_ACTIVITY_NO_HISTORY,确保Activity用完就销毁,不会留下空任务栈。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

