Android:onCreate()被多次调用(而不是我)

时间:2010-11-29 00:04:40

标签: android multithreading oncreate

我现在还不太了解。

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

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

5 个答案:

答案 0 :(得分:13)

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

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

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

HTH

答案 1 :(得分:6)

我在某些三星设备上遇到过两次调用的活动。我解决了它在Manifest上的Activity标签上添加android:launchMode =“singleInstance”。我希望这可以提供帮助。

答案 2 :(得分:0)

当我在开发者选项的应用部分中使用“不保存操作”时,这种情况发生在我身上。确保你已关闭此功能。

答案 3 :(得分:0)

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

下面是一个示例,其中Activity_A调用Activity_B并传递要在Activity_B中收集的intent中的值:

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:launchModel="singleInstance"android:launchModel="singleTop",而Activity_B只会启动一次。希望这会有所帮助。

答案 4 :(得分:0)

类似于此问题,方向改变导致设备重新配置:

Activity restart on rotation Android

我的首选答案:

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

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

例如,如果我有一些在真正创建Activity时应运行的逻辑,而不是在每次方向更改时都应运行,则仅当saveInstanceState为null时,才在onCreate()中运行该逻辑。

否则,我仍然希望布局能够针对方向正确重绘。

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_game_list);

    if(savedInstanceState == null){
        setupCloudMessaging();
    }
}