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

4

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

我使用startActivity()来启动新的活动。当我在活动D上时,我想要重新加载活动A而不是启动一个新的意图。当我从D调用A时,我不能使用startActivity(),因为它会触发onCreate(),从而启动一个线程来获取一些数据。

编辑:更新了堆栈。

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

以下是我的情况。

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

如何避免调用onCreate()方法?

5个回答

5
你需要采用完全不同的方法。无论你是使用startActivity()还是startActivityForResult()启动Activity,因为在启动Activity时都会调用onCreate()onStart()onResume()
现在,如果你的Activity类中有一个方法启动另一个线程来做一些工作,那么你就必须使用标志位。如果你的Activity需要在第一次执行时自动启动线程,则必须将其包装在if语句中以检查首次运行时设置的标志位。
这个想法是当线程第一次执行时,让你的Activity在Application实例或SharedPreferences中设置一个布尔值为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;
    }
}

您需要阅读在任何地方使用应用程序上下文?,以了解如何实现我的伪类YourApplicationInstance


3
以下内容不正确。startActivityForResult()和startActivity()只有被调用的Activity的返回目标不同。

尝试使用startActivityForResult()而不是startActivity()。我认为这不会完全结束活动并重新启动它。我建议使用此链接进一步阅读如何实现此方法。

所以Kgrover的第二点也不成立。
Intent标志http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT正好做到了这一点。
每当您的要求集中在Activity转换时,请密切关注Intent标志。系统提供了出色的支持。
这与Sam Quest的解决方案相同,唯一的区别是如果设置了launchMode,则Activity的堆栈行为将被硬编码,即您的Activity A始终处于singleTask模式。

2

在清单文件中有一个叫做launchMode的标签用于指定activity的启动模式,你可以查看这个链接。当使用该启动模式时,不会调用onCreate方法,而是会调用onNewIntent方法,在该方法中你可以重新初始化你的内容。


0

1) 虽然我不确定,但你可以尝试使用startActivityForResult()而不是startActivity()。我相信这不会完全结束活动并重新启动它。我建议使用this链接以进一步阅读如何实现此方法。

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

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

干杯。希望这能有所帮助。


注意:请注意if语句中的! - Kgrover

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

这将终止子活动。因此父活动不会被重新创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接