2011-08-01 91 views
4

我想从堆栈重新加载一个活动。如何避免在启动Activity时调用onCreate()?

我使用startActivity()开始新的活动。当我在活动D我想重新加载活动A而不是启动一个新的意图。我不能使用startActivity()当致电AD因为它会触发onCreate()它启动线程来获取一些数据。

编辑:更新了堆栈。

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

以下是我的情况。

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

如何避免onCreate()被调用?

回答

5

你必须采取完全不同的方法。无论您是以startActivity()还是startActivityForResult()开始活动,因为onCreate()onStart()onResume()将在您启动活动时被调用。

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

这个想法是让您的活动在您的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; 
    } 
} 

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

0

1)尽管我不确定,但可以尝试使用startActivityForResult()而不是startActivity()。我相信这不会完全结束活动并重新开始。我会建议使用this链接,以便进一步阅读如何实施这样的方法。或者,当您从活动D - > A开始时,继续使用startActivity(),但传递一个虚拟附加。然后在活动A中,使用if语句:

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

干杯。我希望这有帮助。

+0

**注意**:注意'if'语句中的'!' – Kgrover

2

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

2

以下是不正确的。 startActivityForResult()和startActivity()只在所谓的活动

的回报目标))不同尝试使用startActivityForResult(而不是 startActivity(。我相信这不会完全结束活动并重新开始。我会推荐使用这个链接来进一步阅读如何实现这样一种方法。

因此@Kgrover的第2点也不成立。

意向标志http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT正是如此。

只要您有以Activity活动转换为中心的需求,请留意Intent标志。该系统具有良好的支持。

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

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

这会杀死孩子的活动。所以亲子活动不会重新创建

相关问题