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

23

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


4
当设备旋转、键盘打开或切换应用程序且系统决定回收一些内存并关闭您的应用时,onCreate将在您的活动被销毁和重新创建时调用。也许这就是触发此行为的原因? - Yoni Samlan
10个回答

27
您可能希望阅读有关Activity生命周期的文档。
对于每个活动的生命周期,OnCreate只会被调用一次。然而,有许多情况会导致您的活动被杀死并重新启动,因此onCreate将再次被调用。
为了正确支持这一点,您可以在onSaveInstanceState中保存状态信息,并从onCreate中获取到的状态捆绑包中恢复它。

这个回答不符合这篇文章的性质:https://dev59.com/TG865IYBdhLWcg3wLber。该回答声称由于服务启动,应用程序可能会被初始化两次。这是怎么回事? - Mercury

26
除了预期的情况之外,我观察到只有那些创建新线程或可运行对象的活动(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
        }
    }

6
类似问题 - onCreate() 被调用两次。对我来说,是因为在 onCreate() 期间启动了一个 AsyncTask。解决方案:在 onCreate() 中创建 AsyncTask,但将其 execute() 调用放在 postDelayed() 的 Runnable 中: - Guy Smith
也许大家不喜欢我的解决方案,但我通过验证“savedInstanceState”不为空来执行我的代码,成功解决了问题。 - Jimmy ALejandro

10
在我的情况下,子类的 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);
    }
    ...

简单而完美,正是我的代码出了什么问题的原因。 - undefined

6
在我的情况下,是在onCreate之后调用setDefaultNightMode:
super.onCreate(savedInstanceState);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

这个修复了它:

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

3

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


2
这也可能发生在开发者设置中打开了“不要离开活动”的情况下。

1

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

android:configChanges="orientation|keyboardHidden"

如需更多信息,您可以查看官方文档


0
在某些情况下,这可能是由于多次记录造成的。以调试模式运行您的应用程序,并检查您的代码是否运行两次或仅记录多次。
如果只是记录,请查看我在此问题中的答案: Logcat showing information 3 times on AVD

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

我刚遇到了这个问题,读了所有的内容后,仍然没有帮助。以下是帮助我的方法。

  • 在你的MainActivity.cs类中添加属性MainLauncher = true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接