问题:项目上遇到个问题,有个 SingleInstance 的 activity Activity-A, 可以看成一个dialog样式的list,点击其中的每个item可以打开对应的详情界面,即跳转到 Activity-B,跳转到 Activity-B 后仍会控制让 Activity-A 再次弹出覆盖在 Activity-B 之上,可以再次点击其中的item打开新的详情界面, Activity-B 是个普通 activity, 预期是每次点击 Activity-A 中的item 后会打开一个新的 Activity-B 来显示详情,多次点击后应该有多个 Activity-B 的实例,分别显示不同item的详情。 然而实际过程中发现 Activity-B 始终只有一个实例,始终显示的是最后一次点击的item的详情, 即便在startActivity的intent中不添加任何flag也是如此。
原因: 查看官方文档后发现,从一个 SingleInstance 的 Activity 跳转到别的 Activity 时, 默认是加了 FLAG_ACTIVITY_NEW_TASK 的。
A "singleInstance" activity, on the other hand, permits no other activities to be part of its task. It's the only activity in the task. If it starts another activity, that activity is assigned to a different task — as if FLAG_ACTIVITY_NEW_TASK was in the intent.
而如果添加了 FLAG_ACTIVITY_NEW_TASK ,如果目标 Activity 已经存在于一个task时,不会创建一个新的实例,而是把已有的那个task带到前台, 所以导致了以上问题的出现。
“Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent().”
解决办法:在 startActivity 的 intent 里同时加上 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_MULTIPLE_TASK (必须同时使用),官方文档对FLAG_ACTIVITY_MULTIPLE_TASK 的解释是:
Used in conjunction with FLAG_ACTIVITY_NEW_TASK to disable the behavior of bringing an existing task to the foreground. When set, a new task is always started to host the Activity for the Intent, regardless of whether there is already an existing task running the same thing.
参考官方文档: