重新启动已在运行的活动

时间:2012-09-22 23:39:04

标签: android android-activity android-lifecycle

这是问题所在。我有一个应用程序,我想按一个按钮,启动一个显示项目列表的新活动,允许用户选择任意数量的项目,单击提交并将该数据发送到调用新活动的原始活动物品清单。这是基本结构:

Activity A -> Activity B (select items, press submit) -> [already running] Activity A (receive sent items)

我来回传输数据没有问题。我遇到的问题是,当我尝试重新启动活动A时,它会通过活动的onCreate()方法。我不想这样做,因为我希望能够事先在onCreate()方法中设置所有内容,然后通过onRestart()方法补充已经存在的内容。我不确定为什么每次重新启动活动时都会调用onCreate()方法。我的猜测是我在活动B中调用活动的方式:

Intent intent = new Intent(this, PatientChartActivity.class);
intent.putExtra("checked", checked);
intent.putStringArrayListExtra("checked", checked);
startActivity(intent);

我一直在关注Android活动生命周期,我不确定为什么它不会自动返回到之前的活动,除非我确实必须强制它这样做。我确信的一件事是正在运行的活动没有被销毁。我在Log.v(TAG, "DESTROY")方法中输入了onDestroy()日志消息,确保它不会破坏活动。我在启动活动时尝试使用不同的标志告诉系统我想要恢复以前启动的活动,但这些似乎也不起作用。我可能会误解他们。我已就此主题研究了exstensiveley,但我找到的解决方案都没有帮助。 Here是我发现的一个与我的相同的问题 但似乎没有解决我想要的东西。我还查看了以下链接,了解了解决问题的其他可能途径,但没有奏效。

http://www.droidnova.com/use-intents-to-start-other-activities,76.html

http://www.warriorpoint.com/blog/2009/05/24/android-how-to-switch-between-activities/

2 个答案:

答案 0 :(得分:0)

而不是

startActivity(intent);

在您的活动A中,使用

startActivityForResult(intent);

这样,当特定活动完成后,您将获得结果。在活动A中覆盖它:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //TODO handle here. 
}

当活动B完成后,调用this.finish()。然后它将返回到Activity A,并调用上面的方法,这意味着你不会调用Activity A中的onCreate。

答案 1 :(得分:0)

根据您所述的内容实际完成的内容(“活动A - >活动B(选择项目,按提交) - > [已经运行]活动A(接收已发送的项目)”)是:< / p>

活动A =新实例 - &gt;转到活动B =新实例 - &gt;再次访问活动A = 新实例

所以你的活动“堆栈”实际上是活动A的两个实例和活动B的一个实例。这就是你在活动A中的第二次调用初始化它并再次调用'onCreate()'的原因。问题的解决方案之一,可能是最好的解决方案:

来自活动A使用此方法启动活动B:'startActivityForResult()'。然后在活动B中,尽管你现在开始活动A,尝试通过这个函数将结果设置回活动A:'setResult(int resultCode,Intent data)'然后在活动B中调用'finish()'。实现'onActivityResult()'方法。

我现在将解释应用程序生命周期:

  • 活动A被初始化并开始活动B等待结果以便与它做“某事”。到目前为止一切顺利。
  • 活动B被初始化,并且在提交之后它确实为活动A设置了结果。然后它自己完成并自动将结果传递给之前的活动。
  • 活动A再次关注, ALREADY INITIALIZED 并调用'onActivityResult()'方法。活动B中设置的“意图”现在在活动B中传递。

告诉我这是否有帮助,如果你需要一些示例代码。