问题描述:
项目有个需求,当收到推送的时候,应用弹出一个弹框,点击弹框可以跳转至APP内相应的页面查看详细信息。当APP已经是打开状态的时候,收到消息,弹出弹框,点击并且跳转,这没有什么问题。问题出现在,当APP已经退出了,这时候再收到消息,可以弹出弹框,点击弹框依旧可以跳转,这里我们做了处理,当用户点击返回的时候,我们会回到主界面,但是当第二次消息再次送达时,点击弹框,此时不会再进行跳转了。
问题原因:
经过排查发现,当从SingleInstance start Activity的时候,实则是默认带上 FLAG_ACTIVITY_NEW_TASK 的,这个flag大家应该都挺熟悉,当我们用非Activity或Fragment的Context Start Activity的时候,都需要带上这个flag,不然会报错。那么为什么在APP退出的状态下点击跳转,第一次可以跳转而第二次不能跳转呢?这就是FLAG_ACTIVITY_NEW_TASK这个标志位搞的鬼,第一次的时候,因为我们的APP是未开启的状态,所以,是没有相应的Task的,这时候就可以正常的跳转。当点击返回,因为做了特殊处理,使APP回到首页,这时候,我们的Task就形成了。因为我们打开的Activity和MainActivity都是同一个Task的,所以,从SingleInstance Start的时候,如果这个Task存在,就会把这个Task拉到前台了,所以,这就是为什么第二次点击了,没反应的问题,因为,APP已经在前台了。如果这个时候,我们按Home键返回桌面,再次点击弹框跳转,会发现APP回到前台了,但是仍旧没有打开我们想要跳转的Activity,这刚好验证前面的说明。下面是Google对SingleInstance的说明。
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.
问题解决:
我启动的这个Activity在AndroidManifest里面实则是声明为SingleTask的LaunchMode的,但是仍是会出现这个问题。所以这里,就我而言,我在启动这个Activity的时候,同时设置了两个flag FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TOP,实则也是达到SingleTask的效果,运行,问题解决。