17

有件事我现在不太明白。

我的主要活动类创建了一个服务,它创建了一个等待 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 个线程在运行,没有用户交互。文档说:“首次创建活动时调用。”。该活动已经在运行,我不想创建它。

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

4

5 回答 5

14

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

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

如果是这种情况,您可能会发现扩展 Application 类并在那里进行初始化很有用。看到这篇文章... Activity 在 Android 上轮换重启

高温高压

于 2010-11-29T01:49:35.823 回答
6

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

于 2015-07-14T13:09:56.927 回答
1

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

旋转Android上的活动重启

我的首选答案:

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

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

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

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

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_game_list);

    if(savedInstanceState == null){
        setupCloudMessaging();
    }
}
于 2019-11-16T04:10:47.990 回答
0

当我在开发人员选项的应用程序部分中使用“不保存操作”时,这种情况发生在我身上。确保您已将其关闭。

于 2013-06-06T15:47:20.850 回答
0

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

下面是一个示例,其中 Activity_A 调用 Activity_B 并传递要在 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 只会启动一次。希望这可以帮助。

于 2017-05-22T15:41:28.967 回答