最近做项目时测试提了个问题:查看联系人时,收到新短信,查看短信后,按返回键,回到了launcher而不是联系人(其实不一定要是联系人,其他应用也一样)。看到这个问题第一感觉是“这个问题和应用的启动模式和Flag有关”,然后觉得这不是问题。测试备注了这个”问题“Google对比机上也存在,本来想直接关掉的,但是想想具体原因自己也不清楚,还是看下吧。
这种问题一般看下启动时的flag就能大概找到问题的原因,想看启动时的flag可以通过Android studio调试,也可以直接看log,一般直接用logcat,因为比较简单。抓了下从接收到短信点击通知进入短信到返回桌面的log:
1 | 01-15 08:30:52.510 894 1114 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x1000c000 cmp=com.google.android.apps.messaging/.ui.conversationlist.ConversationListActivity} from uid 10082 |
其中uid为10082的应用就是com.google.android.apps.messaging。可以看到点击通知后是先进入.ui.conversationlist.ConversationListActivity然后再跳转到.ui.conversation.ConversationActivity的。启动.ui.conversationlist.ConversationListActivity时的flag是0x1000c000,可以拆分成三个flag的组合:
- 0x10000000:FLAG_ACTIVITY_NEW_TASK
- 0x00008000:FLAG_ACTIVITY_CLEAR_TASK
- 0x00004000:FLAG_ACTIVITY_TASK_ON_HOME
第三个flag看起来很像是造成问题的原因,来看下注释:
1 | /** |
也就是说添加这个flag会导致新启动的stack放到当先home activity stack上,再加上FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK这两个flag,最后的结果就是创建一个新的stack并把activity放到这个stack里,然后把这个stack放到home activity stack上面,该stack变成可见stack,home在它下面,所以这个stack中的activity中的activity都销毁后,home activity stack就会变成可见stack,所以这个问题里按home键会直接从Message进入到launcher。