簡體   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