总所周知,Application可以注册一个activity的生命周期回调。如下:
application.registerActivityLifecycleCallbacks(object:ActivityLifecycleCallbacks{
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
TODO("Not yet implemented")
}
override fun onActivityStarted(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityResumed(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityPaused(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityStopped(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
TODO("Not yet implemented")
}
override fun onActivityDestroyed(activity: Activity) {
TODO("Not yet implemented")
}
})
那onActivityCreated和activity的onCreate到底哪一个先执行呢?
说出这个问题,大家会不会觉得我傻了,肯定是onCreate先执行了,我也是这么想的。可是今天看到一段代码却惊呆了我,代码大致如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(AppManager.getInstance().isAppKilled()) {
}
}
public class AppManager {
private boolean isKilled = true
}
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
activityList.add(activity);
if (如果是启动的activity) {
setAppIsKilled(false)
}
}
上面的代码一看是不是就感觉,这个app在无限重启,因为isKilled 默认为true 且一定会先调用onCreate方法 所以就会无限重启了。
但是事实确实,app正常打开。我去!!!为啥,难道是我记错了?当时真的有点错愕,所以直接看了源码,那么onActivityCreated是何时调用的呢?
我们看一下Activity onCreate的源码
protected void onCreate(@Nullable Bundle savedInstanceState) {
getApplication().dispatchActivityCreated(this, savedInstanceState);
}
这里面有这么一段话,getApplication().dispatchActivityCreated(this, savedInstanceState);获取了Application,并且调用了dispatchActivityCreated。好见证奇迹的时刻到了,看看dispatchActivityCreated做了什么吧
void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
savedInstanceState);
}
}
显而易见,分发了注册进去的生命周期回调,那我们这个场景简单来说,调用了onActivityCreated。
那我们回过头看看为什么那一端代码可以执行吧,因为在onCreate先调用了super,所以一路super最终在activity里面进行了注册的事件分发,调用了onActivityCreated。在onActivityCreated执行完毕之后才调用了onCreate super之后的代码 即执行力重启之前的判断。
😥
这么一分析,其实就很明了了,虽然方法是onCreate先被调用执行,但是写在onCreate在调用super之后的代码却执行在了onActivityCreated之后🙄。但凡手抖一下调用顺序错位一下,app就启动不了了。所以我称这个代码写的真的是刀尖舔血😂。不知道当时写代码的人是真的了解了,还是凑巧😅
🤦?♀?
总结一下:onCreate方法先与onActivityCreated调用。执行顺序:onCreate方法里super之前的代码先执行,其次执行onActivityCreated的代码,最后执行onCreate方法里super之后的代码。虽然比较简单,但是感觉还是蛮重要的😂。
|