我想从堆栈重新加载一个活动。
我使用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()
?
答案 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);
}
这会杀死孩子的活动。因此不会重新创建父活动