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

问题描述 投票:0回答:11

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

android oncreate
11个回答
30
投票

除了预期的情况外,我观察到只有那些创建新线程或可运行的活动(onCreate)被调用两次。 (我相信这是 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
        }
    }

29
投票

您可能需要阅读有关活动生命周期的文档。

OnCreate 在 Activity 的每个生命周期中只会被调用一次。 然而,有很多情况可能会导致您的 Activity 被终止或恢复。 这样,onCreate就会被再次调用。

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


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();
    }
    ...

换算成这样:

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

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

8
投票

在我的例子中,它在onCreate之后调用setDefaultNightMode

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

这解决了它:

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

3
投票

我也遇到了类似的问题,是由 MobileAds 引起的。 在我初始化它们之后,问题就消失了。

    


2
投票


1
投票

super.onCreate(...)

欲了解更多信息,您可以查看
官方文档


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

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


0
投票

如果只是记录,请检查我在这个问题中的答案:

Logcat 在 AVD 上显示信息 3 次


0
投票

将属性
    android:configChanges="orientation|keyboardHidden"
  • 添加到您的
    MainLauncher = true
    类中。
    
        

0
投票
MainActivity.cs

方法中管理

savedInstanceState
OnCreate

	
© www.soinside.com 2019 - 2024. All rights reserved.