记singleInstance的一个坑

之前曾经写过一个Demo,遇到了一个奇怪的行为,今晚查找launchMode相关资料的时候竟然以外得到了原因,急忙记录下来。

先说说行为。这个Demo有3个Activity:Main、A、B。Main的launchMode设置为singleInstance,上有两个按钮可以分别启动A和B。

除此以外,还有一个Widget,点击之后会进入Main。

接下来我的操作:打开Main,点击进入A,按Home,点击Widget回到Main,点击进入B,按Home,点击Widget回到Main,点击试图进入A,谁知打开来竟然是B!

今晚无意中找到这样一个帖子:android - How to start an activity from a singleInstance activity? - Stack Overflow,发现了他摘录的官方文档,终于明白:

原来,singleInstance的Activity是它所在的唯一一个Activity,因此从这里打开的Activity会在新的Task中打开,就像使用了FLAG_ACTIVITY_NEW_TASK一样。如果去翻翻这个flag就会发现,它会查找是否被启动的已经存在,如果存在,它会切换到这个task但是并不会自动pop上层的activity!

继续翻阅就会发现,想要无条件创建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.

也就是说,使用这个会不停地创建新的task。

我循环进入Main - 点击进入A - Home - 点击Widget进入Main,这样几次之后,用dumpsys查看了app的所有activity,果然已经有五六个A的task了……

最后该思考一下,对于一个需要返回Main的Widget或Notification,应该如何设计跳转呢?


记singleInstance的一个坑
https://perqin.github.io/2016/11/05/confusion-in-single-instance-launch-mode/
作者
Perqin
发布于
2016年11月6日
许可协议