一个活动的一个实例以意图开始

时间:2012-12-02 10:52:22

标签: android android-lifecycle

我有一个活动是通过按钮从另一个活动开始的,并在启动时传递一个意图。 我现在想通了,然后创建了几次活动,因为它是以意图启动的,每次按下上面提到的按钮时都会调用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
}

您是否知道如何轻松解决这种情况?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

Intent intent = new Intent(getApplicationContext(),
            YourCustomActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

答案 2 :(得分:0)

在上述情况下,当用户使用创建意图和启动活动的按钮导航回上一个活动时,实际上会调用onDestroy()。即实际上在这种情况下,只有一个活动实例,而前一个活动正在销毁。

因此,在上面的设置中没有调用onNewIntent()。如果你想要,例如停止服务器,如上面问题中的一段代码所示,这样你再次按下按钮就可以开始一个新服务器,你实际上可以简单地这样做:

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

希望能帮助他人:)