2013-03-14 113 views
5

在正常的開發過程中,我注意到特定的活動在第二次調用時似乎停止了響應。onResume()未被第二次調用活動

menu->(intent)->activity->(back button)->menu->(intent)

沒有什麼在logcat的相關性。

我甚至不知道從哪裏開始調試這也不是什麼代碼,所以這裏顯示是onClickonResume片段:

if (!dictionary.getClassName().equals("")) { 

      this.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        Intent i; 

        i = new Intent(mContext, NVGlobeNavigatorVC.class); 
        i.putExtra("PAGE_TITLE", title); 
        i.putExtra("TITLE", _dictionary._title); 

        mContext.startActivity(i); 

      }); 
     } else { 
      findViewById(R.id.greaterthan).setVisibility(View.GONE); 
     } 

,並在活動正在展開:

@Override 
protected void onResume() { 

    super.onResume(); 

    ... 

清單中沒有任何異常:

<activity 
    android:name=".NVViews.NVGlobeNavigatorVC" 
    android:theme="@style/WindowTitleBackground" 
    android:label="GlobeNavigator"/> 

對於clar ity,我在mContext.startActivity(i)super.onResume()上設置了斷點。我點擊onClickListener的視圖,並且兩個斷點均按預期擊中。然後按下返回按鈕,返回到菜單。按預期調用onPause()

我觸摸視圖以再次啓動該活動,並且目標活動中的startActivity中的斷點被擊中,但不在onResume()中。屏幕變黑,我可以重新開始的唯一方法就是重新啓動應用程序。如果我暫停調試器,它暫停在dalvik.system.NativeStart(),這意味着該活動永遠不會重新啓動。

我不認爲它是相關的,但我使用Intellij IDEA並刪除了所有的輸出目錄,使緩存失效並完成了重建。

目標API是8.我已經測試過2.3和4.0.4。

任何想法?我很難過。

[編輯]

在,我一些東西保存到首選項。的onResume()目的是爲了再次讓他們:

@Override 
protected void onPause() { 

    super.onPause(); 

    SCPrefs.setGlobeViewViewPoint(globeView.getViewPoint()); 
    SCPrefs.setGlobeViewZoom(globeView.getZoom()); 
    SCPrefs.setGlobeViewScale(globeView.getScale()); 

    } 
+0

是否正確地調用了第二個活動的oncreate? – stinepike 2013-03-14 22:01:45

+0

@StinePike如果'Activity'在後臺不應該被調用。你重寫'onPause()'並在那裏做任何事情? – codeMagic 2013-03-14 22:02:37

+0

@StinePike它沒有被調用,但我不期望它是因爲它在堆棧的頂部,Android不太可能會破壞我的活動。 – Simon 2013-03-14 22:07:01

回答

4

我發現這個問題,這是一個有點深奧。

我有一個很大的靜態數據結構,它被加載到一個類的靜態初始化程序中。如果數據結構仍然被加載,則該初始化程序中存在一個錯誤,導致無限循環第二次被調用。

因爲該類在我的Activity中被引用,所以類加載器在調用onCreate()onResume()之前加載它。

該循環給出了活動加載器已掛起的外觀。

+0

我很高興你明白了。 – HalR 2013-03-20 21:04:59

+0

所以,你究竟是否解決了這個問題,因爲我有完全相同的問題。 – Rouz 2014-10-16 19:57:34

+0

@Rouz正如我所說。靜態初始化程序中存在一個導致無限循環的錯誤。我修復了這個錯誤,然後它全部奏效了。關鍵是在onCreate()之前調用類加載器。 – Simon 2014-10-19 11:19:55

3

此代碼:

i = new Intent(mContext, NVGlobeNavigatorVC.class); 

創建一個新的意圖。意圖是類NVGlobeNavigatorVC.class

如果您只需調用一次,就會創建一個新的活動,我們稱之爲「iTheFirst」。如果您退出活動,它會在「暫停」時執行。當您再次運行上面的代碼時,您將創建另一個同一類的新活動,但具有不同的活動性。因此它不會恢復你的其他活動,而是創建一個我們可以稱之爲「iTheSecond」的新活動。它看起來就像iTheFirst,但是很獨特。

如果您想恢復上述操作,退出之後,您需要在菜單中保留對其的引用。然後,在您的onClick中,查看該活動是否存在,如果不存在,則創建一個新活動並開始活動,如果活動存在,則恢復活動。

這裏是記住並重新啓動活動的樣本活動:

Intent savedCueCardActivity = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState, R.layout.landing); 
} 

public void goToNextScreen(View v) { 
    if (savedCueCardActivity == null) { 
     savedCueCardActivity = new Intent().setClass(this, CueCardActivity.class); 
     startActivity(savedCueCardActivity); 
     //  lastActivity.finish(); 
    } else { 
     savedCueCardActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     startActivity(savedCueCardActivity); 
    } 
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
} 
+0

我知道所有這一切。請閱讀這個問題。我不希望與同一個實例一起工作。無論第二次啓動Activity是否是同一實例,新實例還是第40個實例,我仍然期望onResume被調用。哦,並且我的應用程序不會掛起;) – Simon 2013-03-15 06:11:30

+0

要更加清楚,應在每個可能的情況下調用「onResume()」。此外,我的問題是,應用程序掛起,顯然在DVM中,沒有任何相關的logcat。如果我不做調試就離開它,我最終會得到一個ANR,因此主線程已停止響應。 – Simon 2013-03-15 07:55:07

+0

對不起您的深層問題。你對你的問題的評論讓我相信你認爲你已經恢復了原來的活動。因爲我知道每次創建新活動時都會得到一個onCreate(),就像您在使用i = newIntent時所做的那樣。這個問題對我深入挖掘活動生命週期非常有用,所以我真的很感激它。 另一個建議 - 在調用onCreate()之前,初始化發生在活動中。你在那裏做什麼奇怪的事情?你有沒有覆蓋onCreate看到它叫? – HalR 2013-03-15 17:17:56