最近在重温四大组件的时候,发现一个有趣的问题。因为记得之前阅读《Android开发艺术探索》的时候,发现非Activity类型的Context启动去启动另一个Activity的时候会报Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.Is this really what you want? 的崩溃异常。然而我在测试的时候使用getApplicationContext().startActivity()却可以正常的跳转。对事情产生疑惑,经过百度,然后自己进行验证事情的真相。
打开Android Api级别为28源码,发现ContextImpl的startActivity方法一切都阔然开朗了。
即使不看代码,方法注释也说的很明白了,也就是说不是Activity类型的Context去启动另一个Activity需要加上FLAG_ACTIVITY_NEW_TASK的FLAGS,除非调用者指定了任务栈,否则就会抛出异常。这是一个错误存在于N和O-MR1之间。其他版本API会造成崩溃异常。我在小米8 Android 9.0上测试也确实崩溃了,日志也显示以上异常。
对比API27(O-MR1) ContextImpl源码,发现27 将option作为一个判断条件去判断是否应该抛出异常。而当使用getApplicationContext().startActivity(intent)的时候,它就跳出了if 条件语句了。
感谢 https://www.wandouip.com/t5i374600/
疑问解决,我又有了一个疑问了,既然这个问题应该是解决非Activity类型Context启动另一个Activity崩溃问题,因为非Activity类型的Context没有所谓的任务栈,那么N 到 O-MR1版本为什么跳过if语句也不会崩溃呢?