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

Posted

技术标签:

【中文标题】多次调用“activity.onCreate()”方法是不是正常【英文标题】:Is it normal for the "activity.onCreate()" method to be called multiple times多次调用“activity.onCreate()”方法是否正常 【发布时间】:2011-04-05 01:24:46 【问题描述】:

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

【问题讨论】:

onCreate 将在您的活动被销毁并重新创建时被调用,这发生在设备旋转、键盘打开或您切换应用程序并且系统决定是时候回收一些内存和杀死你的应用程序。也许这在这里触发了这种行为? 【参考方案1】:

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

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

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

【讨论】:

这个答案不符合这篇文章的性质:***.com/questions/3947052/…。它声称由于服务启动,应用程序可以被初始化两次。怎么来的?【参考方案2】:

除了预期的情况外,我观察到只有那些活动 (onCreate) 被调用了两次,它们正在创建新的线程或 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
        
    

【讨论】:

类似问题 - onCreate() 被调用两次。对我来说,是由在 onCreate 期间启动 AsyncTask 引起的。解决方案:在onCreate期间创建AsyncTask,但是把它的execute()调用放在一个postDelayed() Runnable中: 也许你们都不喜欢我的解决方案,但是我解决了验证savedInstanceStatewasn't null 是否执行我的代码的问题【参考方案3】:

在我的例子中,子类的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);
    
    ...

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

您也可以自己处理配置更改,在AndroidManifest上设置以下语句,在activity配置中:

android:configChanges="orientation|keyboardHidden"

更多信息,您可以查看official documentation

【讨论】:

【参考方案7】:

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

有 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 次)。

如果您用于启动活动的不是此侦听器类型,您可能需要查看文档以了解触发您活动的侦听器以查看您是否遇到类似情况。触发监听器的可能不止一个事件。

【讨论】:

【参考方案8】:

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

如果它只是记录检查我在这个问题中的答案: Logcat showing information 3 times on AVD

【讨论】:

以上是关于多次调用“activity.onCreate()”方法是不是正常的主要内容,如果未能解决你的问题,请参考以下文章

Android 何时在 Activity.onCreate() 中的 setContentView() 之后首次调用 View.onMeasure()?

从Android Activity onCreate方法调用QCoreApplication方法

Android源码解析Activity#setContentView()方法

关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常

关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常

Android Activity启动流程源码解析