"activity.onCreate()"方法被多次调用是否正常?

MyN*_*ero 14 android oncreate

我在onCreate方法和Activity中有一些代码,并注意到它被调用了三次.这是正常的行为吗?谢谢.

Che*_*mon 25

您可能希望阅读有关Activity生命周期的文档.

OnCreate只会在Activity的每个生命周期中调用一次.但是,有许多情况会导致您的活动被杀死并恢复生机.因此,onCreate将再次被调用.

为了正确支持这一点,您可以将状态信息保存在onSaveInstanceState中,并在创建时获得的状态包中恢复它.


M. *_*han 18

除了预期的情况之外,我观察到只有那些活动(onCreate)被调用两次才创建新的Thread或Runnable.(我相信这是Android中的一个错误).

解决方案很简单(尽管你可能不喜欢它:p)

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

        if(savedInstanceState == null){
            // everything else that doesn't update UI
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 类似的问题 - onCreate()被调用两次.对我来说,是在onCreate期间启动AsyncTask引起的.解决方案:在onCreate期间创建AsyncTask,但将其execute()放在postDelayed()Runnable中: (6认同)

小智 11

就我而言,onCreate子类的方法运行了两次。onCreate调用超类的方法后更改主题会导致此问题。我在onCreate超类的方法之前设置主题,然后onCreate子类的方法不再被调用。

    public class XActivity extends YActivity { // XActivity is subclass

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

    public class YActivity extends AppCompatActivity { //YActivity is superclass.

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme();
    }
    ...
Run Code Online (Sandbox Code Playgroud)

转换成这样:

    public class YActivity extends AppCompatActivity { // YActivity is superclass.

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setTheme();
        super.onCreate(savedInstanceState);
    }
    ...
Run Code Online (Sandbox Code Playgroud)


Cri*_*sti 7

就我而言,它是在onCreate之后调用setDefaultNightMode

super.onCreate(savedInstanceState);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
Run Code Online (Sandbox Code Playgroud)

这解决了它:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)