2011-08-01 37 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); 
} 

這會殺死孩子的活動。所以親子活動不會重新創建

相關問題