如何在启动Activity时避免调用onCreate()?

时间:2011-08-01 23:45:14

标签: android android-activity stack

我想从堆栈重新加载一个活动。

我使用startActivity()开始新的活动。当我在活动D 时,我想重新加载活动A 而不是启动新的Intent。从 D 调用 A 时,我无法使用startActivity()因为它将触发onCreate(),它会启动一个线程来获取某些数据。

编辑:更新了堆栈。

如果我使用FLAG_ACTIVITY_REORDER_TO_FRONT,则会再次调用onCreate()方法。

以下是我的情景。

Login Activity ̣→ Activity A → Activity B → Activity C → Activity D → Activity A

如何避免被叫onCreate()

5 个答案:

答案 0 :(得分:5)

你必须采取完全不同的方法。如果您使用startActivity()startActivityForResult()启动活动并不重要,因为启动活动时会调用onCreate()onStart()onResume()。< / p>

现在,如果您的Activity类中有一个方法启动另一个线程来完成某些工作,那么您必须使用标志。如果你的Activity需要在第一次执行时自动启动线程,那么你必须将它包装在if子句中,以检查你在第一次运行时设置的标志。

我们的想法是在首次执行线程时,在Application实例或SharedPreferences中将Activity设置为true。当你回到那个Activity并且不希望由于调用onCreate()而自动运行该线程时,你必须将你的调用代码包装在if子句中,如下例所示。

这是一个例子。

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    // Other stuff

    if (!YourApplicationInstance.wasCalled) {
        // Run your thread or do something else you want to do only once.

        // Set the wasCalled flag to true to not run this code again
        // if onCreate() is called a second time.
        YourApplicationInstance.wasCalled = true;
    }
}

您必须阅读Using Application context everywhere?以了解如何实现我的伪类YourApplicationInstance

答案 1 :(得分:2)

清单中有一个名为launchMode的标签用于活动。结帐link。这不会调用onCreate但会调用onNewIntent,你可以重新初始化你的东西。

答案 2 :(得分:2)

以下情况并非如此。 startActivityForResult()和startActivity()仅在被调用的Activity

的返回目标中有所不同
  

尝试使用startActivityForResult()而不是   startActivity()。我相信这并没有完全结束活动并重新开始。一世   建议使用此链接以进一步阅读如何实现此类方法。

@Kgrover的第2点也没有。

Intent标志http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT就是这样做的。

每当需求以活动转换为中心时,请留意Intent标志。该系统具有出色的支持。

这相当于Sam Quest的解决方案,唯一的区别是,如果设置launchMode,您的Activity的堆栈行为将被硬编码,即您的活动A始终处于singleTask模式。

答案 3 :(得分:0)

1)虽然我不确定,但您可以尝试使用startActivityForResult()而不是startActivity()。我相信这并没有完全结束活动并重新开始。我建议使用this链接以进一步了解如何实现此类方法。

2)或者,当你从活动D - >&gt; A,继续使用startActivity(),但传入一个虚拟额外的。然后在活动A中,使用if语句:

 if(!(this.getIntent().hasExtra("dummyStringExtra")) {
  //fire the data thread here 
}

干杯。我希望这会有所帮助。

答案 4 :(得分:0)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            return true; 
    }
    return super.onOptionsItemSelected(item);
}

这会杀死孩子的活动。因此不会重新创建父活动