首页 > 解决方案 > 被覆盖的 android 生命周期方法如何在 super 调用之后运行代码而不转到其后续的生命周期方法

问题描述

看看这个。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onStart() {
    super.onStart();
}

假设此代码来自作为Activity类子的正常活动。super.onCreate()是中的第一个语句onCreate()。这个超级调用必须是连接点通知父类onCreate()在派生类中调用,可以调用下一个生命周期方法,这很onStart()明显。

也就是说,执行顺序必须是这样的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);              <-- ( 1 )
    setContentView(R.layout.activity_main);          <-- ( 3 )
}

@Override
protected void onStart() {
    super.onStart();                                 <-- ( 2 )
}

但它看起来像这样工作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);              <-- ( 1 )
    setContentView(R.layout.activity_main);          <-- ( 2 )
}

@Override
protected void onStart() {
    super.onStart();                                 <-- ( 3 )
}

这怎么可能?

标签: javaandroidandroid-lifecyclesuper

解决方案


因为onStart()在之后 onCreate()调用的,而不是它调用的。

看看这里

ActivityThread#startActivityNow()实例化 Activity 并调用onCreate().

往下几行你会看到一个 call to ActivityThread#handleStartActivity()which is what calls onStart()

由于那里没有异步,Java 将等待onCreate()完成,然后再继续并最终调用onStart().

查看 Activity.java 中的源注释以获取有关 Activity 生命周期如何工作的更多详细信息。


推荐阅读