繁体   English   中英

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

[英]Is it normal for the "activity.onCreate()" method to be called multiple times

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

您可能需要通读有关Activity 生命周期的文档。

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

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

除了预期的情况外,我观察到只有那些活动 (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
        }
    }

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

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

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

android:configChanges="orientation|keyboardHidden"

有关更多信息,您可以查看官方文档

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

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

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

如果不是您用来启动 Activity 的侦听器类型,您可能需要查看触发您的 Activity 的侦听器的文档,看看您是否遇到了类似的情况。 很有可能不仅仅是一个事件触发了监听器。

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

如果它只是记录,请检查我在这个问题中的答案: Logcat 在 AVD 上显示信息 3 次

我刚刚遇到了这个问题,在阅读了所有这些之后,没有任何帮助。 这对我有帮助。

  • 将属性MainLauncher = true添加到MainActivity.cs class。

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

super.onCreate(savedInstanceState);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

这解决了它:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
super.onCreate(savedInstanceState);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM