繁体   English   中英

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

[英]How do I avoid onCreate() being called when starting an Activity?

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

我使用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()

你必须采取完全不同的方法。 如果使用startActivity()startActivityForResult()启动Activity并不重要,因为在启动Activity时将调用onCreate()onStart()onResume()

现在,如果你的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;
    }
}

你必须阅读在任何地方使用应用程序上下文? 了解如何实现我的伪类YourApplicationInstance

清单中有活动的标签叫做launchMode。 结帐此链接 这不会调用onCreate但会调用onNewIntent,你可以重新初始化你的东西。

以下情况并非如此。 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模式。

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

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

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

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

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

干杯。 我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM