【问题标题】:Android: onCreate() getting called multiple times (and not by me)Android:onCreate() 被多次调用(而不是我)
【发布时间】:2010-11-29 00:04:40
【问题描述】:

有些东西我现在不太明白。

我的主要活动类创建一个服务,它创建一个等待 TCP 连接的新线程。一旦有人进来,它就会开始一个新的活动:

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class);
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress());
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);

之后,该类的onCreate() 方法开始运行。它将创建 2 个线程:一个记录和发送数据,另一个接收和播放数据。这些线程有一个永远的while循环。

由于某种原因,我注意到最后一个类的 onCreate() 再次被调用,这使我的程序崩溃。我不明白为什么再次调用它,因为只有 2 个线程在运行,没有用户交互。文档说:“首次创建活动时调用。”。该活动已经在运行,我不想创建它。

有人可以解释一下这种行为吗?

【问题讨论】:

    标签: android multithreading oncreate


    【解决方案1】:

    在某些“设备配置更改”后,Android 会重新创建您的活动。一个这样的例子是方向。你可以在这里阅读更多... http://developer.android.com/guide/topics/resources/runtime-changes.html

    也许您的线程中的某些东西正在做一些被认为是配置更改的事情?

    如果是这种情况,您可能会发现扩展 Application 类并在那里进行初始化很有用。看到这个帖子... Activity restart on rotation Android

    HTH

    【讨论】:

    • 我为此拼命撞墙。我知道这种行为,但从未考虑过grrrrrrrrr。即兴的好!!!
    【解决方案2】:

    我在某些三星设备上遇到了两次调用的 Activity。我解决了它在 Manifest 的 Activity 标记上添加 android:launchMode = "singleInstance" 。我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      与方向改变导致设备重新配置的问题类似:

      Activity restart on rotation Android

      我的首选答案:

      https://stackoverflow.com/a/11811999/3739540

      与其尝试完全阻止 onCreate() 被触发,不如尝试检查传递给事件的 Bundle savedInstanceState 以查看它是否为空。

      例如,如果我有一些逻辑应该在真正创建 Activity 时运行,而不是在每次方向更改时运行,那么只有当 savedInstanceState 为 null 时,我才会在 onCreate() 中运行该逻辑。

      否则,我仍然希望布局正确重绘以适应方向。

      public void onCreate(Bundle savedInstanceState) {
      
          super.onCreate(savedInstanceState);
      
          setContentView(R.layout.activity_game_list);
      
          if(savedInstanceState == null){
              setupCloudMessaging();
          }
      }
      

      【讨论】:

        【解决方案4】:

        当我在开发者选项的应用部分使用“不保存操作”时,曾经发生过这种情况。请确保您已将其关闭。

        【讨论】:

          【解决方案5】:

          当您尝试使用意图中的值启动活动时,我发现了这个问题。

          以下是 Activity_A 调用 Activity_B 并在 Intent 中传递值以在 Activity_B 中收集的示例:

          Intent intent = new Intent(this, activityB.class);
          intent.putExtra("val1", someValue1);
          intent.putExtra("val2", someValue2);
          intent.putExtra("val3", someValue3);
          this.StartActivity(intent);
          

          在这种情况下,您可以在 AndroidManifest.xml 中设置android:launchMode="singleInstance"android:launchModel="singleTop",Activity_B 只会启动一次。希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-08-11
            • 1970-01-01
            • 2020-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多