Android:onActivityCreated和onCreate到底那一个先调用呢?一 记曾看到刀尖舔血的代码

博客详细分析了Android中onCreate方法与onActivityCreated回调的执行顺序,通过源码解释了为何在onCreate调用super之后的代码会执行在onActivityCreated之后,强调了理解这一顺序对于避免应用程序错误的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总所周知,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()) {
                //重启app操作
            }
    }
public class AppManager {
//启动app默认设置为true
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)//设置为false之后 AppManager.getInstance().isAppKilled()获取的就是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做了什么吧
/* package */ 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之后的代码。虽然比较简单,但是感觉还是蛮重要的😂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumpkin的玄学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值