有意图的活动的一个实例



我有一个活动,它是通过按钮从另一个活动启动的,启动时会传递一个意向。我现在发现,这个活动被创建了好几次,因为它是带着一个意图启动的,每次我点击上面提到的按钮时都会调用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
}

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

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

尝试设置标志flag_ACTIVITY_REORDER_TO_FRONT它将确保如果堆栈中存在某个活动,它将把该活动放在最前面。

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

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

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

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

希望能帮助他人:)

相关内容

最新更新