安卓:onCreate()方法被多次调用(并非由我调用)

18

我现在有一些不太明白的事情。

我的主活动类创建了一个服务,该服务创建了一个等待TCP连接的新线程。一旦连接进来,它将启动一个新的活动:

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

接着,该类的onCreate()方法会被运行。它将创建两个线程:一个记录并发送数据,另一个接收并播放数据。这些线程都有一个无限循环。

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

请问有人能够解释一下这个行为吗?

5个回答

14

我已经因为这个问题烦恼了很久。我知道这种行为,但从未考虑过,太棒了! - Phantom Lord

8

我发现在某些三星设备上出现了 Activity 被调用两次的情况。我通过在 Manifest 文件中的 Activity 标签添加 android:launchMode="singleInstance" 解决了这个问题。希望这能够帮到你。


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

1
你应该因这个观察获得金牌。 - kfir

1

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

Android上旋转时Activity重新启动

我推荐的答案是:

https://dev59.com/inRB5IYBdhLWcg3w9Lzn#11811999

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

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

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

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_game_list);

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

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和Activity_B中设置android:launchMode="singleInstance"android:launchModel="singleTop",这样Activity_B只会启动一次。希望这能帮到您。

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