Activity中onCreate()与onNewIntent()是否存在竞态条件相关问题?
Activity生命周期相关疑问解答
问题1:同一个Activity实例是否会在短延迟间隔内先后触发onCreate()与onNewIntent()回调?
答案是不会,原因如下:
onCreate()是Activity实例首次创建时才会触发的生命周期回调,同一个实例的整个生命周期内只会执行一次,只有实例被销毁后重新创建才会再次触发该方法。onNewIntent()的触发前提是已经存在对应的Activity存活实例,通常出现在Activity启动模式为singleTop、singleTask、singleInstance,或启动Intent携带FLAG_ACTIVITY_SINGLE_TOP标记时,系统选择复用已有实例而非创建新实例,此时才会回调onNewIntent()传入新的Intent。
如果你观察到两个回调几乎在短间隔内先后触发,只可能是旧实例被销毁后系统立刻创建了新实例触发onCreate(),之后又马上收到新的启动请求复用这个新创建的实例触发onNewIntent(),这种场景下两次回调对应的并不是同一个Activity实例。
问题2:我是否需要对这两个方法中的代码做同步处理?
正常开发场景下不需要,原因如下:
- Android平台所有的Activity生命周期回调默认都在主线程(UI线程)的消息队列中串行执行,前一个回调没有执行完成时,后续的回调消息不会被调度。
onCreate()一定会完全执行完毕之后,才有可能执行后续的onNewIntent()回调,不存在两个方法并发执行的情况,自然不会出现多线程并发访问共享资源的问题。 - 只有一种例外场景:如果你在两个方法内手动创建了子线程,且这些子线程会访问同一个共享变量,此时需要你自行处理子线程之间的同步,这和生命周期方法本身的执行逻辑无关。
内容的提问来源于stack exchange,提问作者Veniamin。
相关产品推荐
相关产品推荐

