2011-04-20 76 views
0

我的應用程序有幾個活動。我需要確定他們當中的哪一個當前處於活動狀態(或者術語是什麼,活動,前景,顯示,...)。有沒有辦法做到這一點?如何獲取當前活動的活動?

(我認爲這是一個簡單而常用的東西,而是尋找半小時後,我什麼也沒得到。:-(

(RunningTaskInfo.topActivity()只返回組件名稱,但我需要它的參考,所以這並不能幫助。)

(A蠻力解決方案來跟蹤活動的引用的全局變量。但是,這在每一個要做的onResume(),它的醜陋IMO)

+0

我不明白這個問題。 '究竟是什麼'需要確定當前活動的活動?活動本身顯然知道「他們是誰」(如果你明白我的意思),所以我只能猜測你需要一些'外部'來知道哪個活動是活動的......還是我誤解了?對你想要達到什麼的進一步解釋可能會有所幫助。 – Squonk 2011-04-21 00:33:42

+0

@彼得史密斯,謝謝。那麼這種情況其實很簡單:當程序流向深處時,像8或10個層次到數據庫引擎或一些常見的例程,活動引用在調用鏈中的某處丟失。所以,是的,一個敏捷的程序員應該忠實地通過這個參考,不管程序在哪裏流動,但是......我很懶。所以我想也許有一個Android類可以提供這個方便的信息。畢竟,在編程中必須非常普遍的是,每個人都需要知道調用它的活動。對? – wwyt 2011-04-21 19:17:18

回答

0

誰過這樣的問題來了,即你需要將當前活躍活動的參考,也沒有在這裏真正解決問題。唯一的方法是你自己跟蹤它,使用全球。是的,使用全球並不是Android編程的最佳方式,但我認爲它的成本更低。

這裏是我做過什麼:

延長我的所有acitivities從相同的基本活動:MotherOfAllActivities。

public class MotherOfAllActivities extends Activity { 
    public void onCreate(...) { 
     globalCurrentActivity = this; 
     ........ 
    } 

    public void onResume() { 
     globalCurrentActivity = this; 
     ........ 
    } 

    public void onPause() { 
     if (globalCurrentActivity == this) 
      globalCurrentActivity = null; 
    } 

    // And, don't forget about onActivityResult(). It can come before onResume() 
    // of the calling activity and after onPause() of the called activity. That is, 
    // there is a window when globalCurrentActivity is null. 
    public void onActivityResult() { 
     globalCurrentActivity = this; 
    } 
} 

,如果你不喜歡這個答案,不要拍我。我只是試圖與人分享什麼對我有用,至少目前爲止。

+0

我很確定這會造成大的內存泄漏。編輯:它的確如此。如果你是(java)編程的新手,你可以通過弄清楚爲什麼是這種情況,以及如何解決這個問題,來做自己的大忙。 – 2011-05-12 00:39:03

+0

請解釋爲什麼會導致內存泄漏 – 2013-07-09 22:15:00

+0

內存泄漏是因爲活動及其所有同級兄弟沒有得到垃圾回收。爲了避免內存泄漏,您可以爲globalCurrentActivity使用WeakReference ; – 2015-03-31 06:00:42

0

有沒有辦法做到這一點?

不是真的。

(A蠻力解決方案來跟蹤活動的引用的全局變量。但是,這在每一個的onResume()來完成。這是醜陋的IMO)

這也是內存泄漏的祕訣。

就個人而言,我會找到一個更好的辦法來解決問題,無論你認爲你是通過獲取「目前activte [原文]活動」解決。

+0

那麼,首先解決的問題其實很簡單:當程序深入時,活動引用在調用鏈中的某處丟失。所以,是的,另一種選擇是沿着從上到下的方式向所有方法添加參數。但那也不是很好,IMO。 – wwyt 2011-04-21 00:04:50

+0

不,不會有內存泄漏,它應該是一個* global *全局變量,就像應用程序或類似的一樣。另外,這個變量不能保存在Activity中,這是內存泄漏的祕訣,因爲我沒有首先引用這個活動! :-) – wwyt 2011-04-21 00:14:13

+0

@wwyt:「* global * global variable」,使用你的酷刑詞組,是內存泄漏的頭號原因。事實上,人們可能會爭辯說,GC環境中的任何內存泄漏都會以「* global * global variable」的形式或形式出現,無論是由開發人員還是由運行時引擎聲明(例如,運行線程的名單) 。在一個靜態數據成員或者一個Application中放置一個Activity可能會導致內存泄漏,除非你總是清除該數據成員,並且如果你認爲在通過方法傳遞對象時遇到困難,抓住所有的情況來清除它。 – CommonsWare 2011-04-21 11:46:03

0

我幾乎沒有專家,但我需要像你提到保持當前突出顯示的按鈕突出(底欄)做一些事情。我想我在每個活動中使用onResume(),就像你提到的那樣,將它存儲在應用程序類變量中。我敢肯定有,雖然

編輯一個更好的辦法:其實我只是重新閱讀你提出什麼......是的,我與commonsware同意存儲實際參考活動是壞的。爲什麼你不能只存儲當前活動名稱的字符串變量?那是什麼我做了跟蹤和突出顯示相應的按鈕

+0

這個名字?但我需要它的引用,以便我可以使用它,例如,currentActivity.findViewById()。如果你需要的只是t他的名字,那麼也許你應該簽出ActivityManager.getRunningTasks()和RunningTaskInfo.topActivity()? – wwyt 2011-04-21 00:08:03

+0

實際上,它並不是當前的topActivity()名稱,因爲它是該topActivity的選項卡主機內的當前選項卡。我敢肯定,有更好的方法來做事情,雖然我會在一天重新訪問乾杯 – wired00 2011-04-21 00:29:27

相關問題