2013-09-23 103 views
0

爲了確保我的活力對傳感器輸入保持響應,我正在onCreate()方法中啓動一個新線程,該方法初始化所有必需的資源,同時UI線程顯示加載消息,商標。如果用戶在此初始化過程中按下主頁按鈕,則我正在使用pause()方法上的活動,以便指示此線程等待,直到另行通知爲止。如果在這個等待狀態下或者當後退按鈕被按下時,活動實際上被銷燬,我目前依靠ondestroy()方法來中斷和銷燬不完整的初始化線程。何時殺死一個活動的初始化線程

不幸的是,當通過從主屏幕選擇它的圖標來恢復應用程序時,活動的onCreate()方法有時被稱爲創建新的初始化線程,而不用調用onDestroy()方法來殺死現有的初始化線程。如果在這種情況下不總是調用onDestroy(),那麼如何確定是否需要銷燬現有的初始化線程?

有關此事的任何幫助和/或建議將非常感激?

回答

0

取決於你的需要,但也許這是足以改變你的活動launchmode清單中:

android:launchMode="singleTask" 

與此相反,「singleTask」和「singleInstance」活動只能開始的任務。它們始終處於活動堆棧的根部。而且,該設備一次只能保存一個活動實例 - 只有一個這樣的任務。

這會阻止onDestroy之前調用onCreate。

編輯:

另一種可能的解決辦法是手動檢查是否有運行在例如應用程序其他進程的onCreate:

ActivityManager activityManager = (ActivityManager) this 
      .getSystemService(ACTIVITY_SERVICE); 
    List<RunningAppProcessInfo> procInfos = activityManager 
      .getRunningAppProcesses(); 
    int counter = 0; 
    for (int i = 0; i < procInfos.size(); i++) { 
     if (procInfos.get(i).processName.equals(this.getPackageName())) { 
      counter++; 
     } 
     if (counter > 1) { 
      // send broadcast to make other activities call finish() or the like 
     } 
    } 

用,因爲它感覺升技的hackish,但因爲沒有其他的建議已經張貼到現在爲止,你不妨試一試發佈這個答案猶豫了。

我將它用於不同的場景,其中手機有時會在啓動後兩次啓動我的應用程序。有了這段代碼,我可以通過簡單地調用finish來防止第二次啓動。

+0

感謝您的信息,我根本不知道這個屬性。不幸的是,我有許多活動將以這種方式進行初始化,並且必須允許它們存在於活動堆棧中的任何位置。 – user2676185

+0

編輯我的答案與另一個建議(不知道你是否得到自動通知) – cYrixmorten

+0

由於等待線程持有對被銷燬的活動/視圖的引用,系統也無法乾淨地刪除它,從而導致備份在堆棧上。再次一些很好的信息,感謝哥們:)我認爲解決這個問題最簡單的方法是永遠殺死onPause()方法中的init線程,並在onResume()方法內重新啓動它。由於您提供了有價值的信息而被標記爲已回答。再次感謝隊友。 – user2676185