[英]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.