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

时间:2010-08-27 23:04:47

标签: android oncreate

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

8 个答案:

答案 0 :(得分:25)

您可能需要阅读Activity lifecycle上的文档。

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

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

答案 1 :(得分: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
        }
    }

答案 2 :(得分:2)

如果您在开发人员设置中启用了“不要离开活动”,也会发生这种情况。

答案 3 :(得分:1)

您还可以自行处理配置更改,在AndroidManifest上设置以下语句,在活动配置中:

android:configChanges="orientation|keyboardHidden"

有关详细信息,请查看official documentation

答案 4 :(得分:1)

就我而言,子类的 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();
    }
    ...

转换为:

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

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setTheme();
        super.onCreate(savedInstanceState);
    }
    ...

答案 5 :(得分:0)

以下是我遇到(并解决)的情景,它会产生您描述的行为:

有3个事件会触发OnTouch - 1. android.view.MotionEvent.ACTION_UP 2.android.view.MotionEvent.ACTION_DOWN 3. android.view.MotionEvent.ACTION_MOVE。

通常,所有这三个事件同时触发以触发OnTouch侦听器。当此侦听器用于启动活动时(通过传递给startActivity()的Intent),您可以重现此行为,该行为会多次调用Activity上的OnCreate(在此示例中为3)。

如果您不是使用此侦听器类型来启动活动,则可能需要查看文档以了解触发您的活动的任何侦听器,以查看您是否遇到类似的情况。有可能不只是一个事件触发了听众。

答案 6 :(得分:0)

我遇到了类似的问题,这是由MobileAds引起的。 在super.onCreate(...)之前初始化它们之后,问题就消失了。

答案 7 :(得分:0)

在某些情况下,可能是由于多次记录。在调试模式下运行您的应用程序,并检查您的代码是否运行两次或只是多次记录。

如果仅记录日志,请检查我在以下问题中的答案: Logcat showing information 3 times on AVD