0

我有一个活动,它通过一个按钮从另一个活动开始,并在启动时传递了一个意图。我现在发现,该活动随后被创建了几次,因为它是从一个意图开始的,并且每次我点击上面提到的按钮时都会调用 onCreate()。在我阅读的文档中,它说“每次有一个“标准”活动的新意图时,都会创建一个新的类实例来响应该意图”,所以我假设我在某个地方有几个该活动的实例在堆栈上。这是我想避免的,因为活动有一些静态变量,这些变量是从其他活动中引用的,我想确保这个变量的值是确定性的!

我想要的是在按下按钮时摆脱所有现有实例并创建一个新的活动实例,或者确保只有一个活动并每次都以新的意图创建它。

我试图通过为活动设置 android:launchMode="singleTop" 并实现 onNewIntent(intent) 来实现这一点。这应该确保在这种情况下我只有一个活动实例并且我得到了新的意图。但是,如果我这样做,我基本上必须复制我的整个 onCreate() 方法,但只是使用新的意图,这感觉不对。

public void onNewIntent(Intent intent) {
    myAdapter= null;
    serverThread.stopThread();
    serverThread = null;
    this.onCreate(...);  // <- somehow do all this with new intent
}

你知道如何轻松解决这种情况吗?

4

3 回答 3

2

您可以将所有代码从 onCreate() 移动到 onStart() 以确保每次打开该活动时都会调用它

于 2012-12-02T11:04:19.820 回答
0

尝试设置标志 FLAG_ACTIVITY_REORDER_TO_FRONT 它将确保如果堆栈中存在活动,它将将该活动带到最前面。

Intent intent = new Intent(getApplicationContext(),
            YourCustomActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
于 2012-12-02T11:10:54.890 回答
0

在上述情况下,实际上 onDestroy() 是在用户使用创建意图并启动 Activity 的按钮导航回上一个 Activity 时调用的。也就是说,实际上在这种情况下,已经只有一个活动实例,而前一个实例正在被销毁。

因此,在上述设置中未调用 onNewIntent()。如果您想停止服务器,如上面问题中的一段代码所示,以便在再次按下按钮时可以启动新服务器,您实际上可以简单地执行以下操作:

@Override
public void onDestroy() {
    serverThread.stopThread();  
    super.onDestroy();
}

希望对其他人有所帮助:)

于 2012-12-02T14:45:53.407 回答