2010-07-23 32 views
2

官方文檔描述如下任務:Android:如何檢測當前的一系列活動(任務)是否移至背景?

*任務中的所有活動都作爲一個單元一起移動。整個任務(整個活動堆棧)可以被帶到前臺或發送到後臺。例如,假設當前任務在其堆棧中有四個活動 - 在當前活動下有三個活動。用戶按HOME鍵,轉到應用程序啓動器,並選擇一個新的應用程序(實際上是一個新任務)。當前任務進入後臺並顯示新任務的根活動。然後,在很短的時間之後,用戶返回到主屏幕並再次選擇先前的應用程序(之前的任務)。這項任務,包括所有四項活動,都會出現。

有沒有辦法在當前活動的任務移入和移出背景的以編程方式檢測?我想知道當用戶切換到另一個應用程序時,與當用戶導航到當前應用程序中的另一個活動時。

+0

如果您能告訴我們檢測的目的是什麼,這可能會有幫助嗎? – EboMike 2010-07-23 03:40:13

+0

基於這兩種情況,我的業務邏輯是不同的。後臺活動在後臺綁定到遠程服務。如果用戶實際上正在切換任務,我希望此背景活動解除綁定。否則,它需要保持綁定,以便將服務展示給我的應用中的其他活動。 – zer0stimulus 2010-07-23 13:23:32

回答

4

注意:我總是把這個設計放在腦海中,但從來沒有到過具體的測試(儘管它確實有效),所以如果你最終嘗試這個,告訴我它是怎麼回事。 :)


我不認爲有這麼會給你此功能(我可能是錯的)官方API方法,但你肯定可以構建自己的。這只是我的做法;當然可能會有更好的實現。

在您的應用程序中,您始終知道何時開始另一項活動。隨着中說,你可以創建處理開始的所有應用程序的活動,並保持當你開始一個活動,代表一個布爾軌道全局類:

public class GlobalActivityManager { 

    private static boolean isActivityStarting = true; 

    public static boolean isActivityStarting() { 
     return isActivityStarting; 
    } 

    public static void setIsActivityStarting(boolean newValue) { 
     isActivityStarting = newValue; 
    } 

    public static void startActivity(Activity previous, Class activityClass) { 
     isActivityStarting = true; 
     // Do stuff to start your activity 
     isActivityStarting = false; 
    } 
} 
在每個活動的

然後(也許是爲了這是一個超類),覆蓋onPause()方法來檢查它是另一個應用程序的活動開始還是外部任務的應用程序出現在應用程序前面。這是有效的,因爲當活動前有任何內容時,onPause被執行,這意味着當你在GlobalActivityManager開始活動時會調用onPause,其中isActivityStarting爲真。

public void onPause() { 
    super.onPause(); 
    if (GlobalActivityManager.isActivityStarting()) { 
     // It's one of your application's activities. Everything's normal. 
    } else { 
     // Some other task has come to the foreground. Do what needs to be done. 
    } 
} 
+0

查看James關於Back按鈕的說法,這會在startActivity不是時會導致當前(前景)Activity的onPause方法被調用。所以也許重寫後退按鈕(我認爲這是可能的)來適當地檢測。但總體來看,這裏需要更多的工作。 – Fraggle 2011-03-26 23:20:58

1

這是行不通的。除了您的應用明確開始其他活動之外,您的活動可能會因onPause而獲得。例如,用戶可能已經點擊後退按鈕,將您帶回堆棧中的前一個活動。

+0

你沒有回答這個問題,對嗎? – 2012-12-13 16:19:09

0

我一直在尋找一個很好的回答這個問題。看起來Andy Zhang有一個好主意,但它可能需要更多的工作來處理其他事情,例如後退按鈕。

另一種看起來很有前途的方法是使用ActivityManager.getRunningAppProcesses()方法,它會給你一個RunningAppProcessInfo列表,每個列表都有一個「重要性」變量,它可以用來檢測你的進程是在前臺還是在前臺其他州。

當然,問題是有沒有檢測技術在這裏,只是一種方式告訴什麼正在運行,並且它的狀態,但沒有辦法讓知情的狀態發生變化時。

所以可能只是運行一個後臺線程來輪詢這個信息。看起來有點可笑,但它可能工作。

我的應用程序使用定位服務(GPS),因此它會自動被調用的位置發生變化時,我可以檢查RunningAppProcessInfo列表時發生這種情況,以確定是否我的應用程序仍然在前臺。看起來像很多工作,所以也許安迪的方法可以改進。

0

您可能可以在onPause()中使用isFinishing()方法。這會告訴你應用程序是否正在完成或剛剛暫停。當你的任務堆棧進入後臺時,活動沒有完成,它們只是暫停。如果你從這個開始另一個活動,這也會被調用,所以你必須檢查。

@Override 
public void onPause() { 
    super.onPause(); 
    if(!isFinishing()) { 
     //app going to background 
    } 
} 
3
public boolean isCurrentTaskInBackground() { 
    List<RunningTaskInfo> taskInfoList = mActivityManager.getRunningTasks(1); 
    if (taskInfoList != null && taskInfoList.size() > 0) { 
     RunningTaskInfo info = taskInfoList.get(0); 

     ComponentName componentName = info.baseActivity; 

     MobileTvLog.debug("App#isCurrentTaskInBackground -> baseActivity = " + componentName); 

     String packageName = componentName.getPackageName(); 

     return !YOUR_PKG_NAME.equals(packageName); 
    } else { 
     return true; 
    } 
} 
2

也許這可以是有益的,告訴我,如果它爲你工作。 只有當您從後臺返回時,活動的值將爲0(零) 其餘時間將是執行onRestart() 時高於0(零)的數字。

public class FatherClass extends Activity { 

private static int activities = 0; 

public void onCreate(Bundle savedInstanceState, String clase) { 
    super.onCreate(savedInstanceState); 
} 

protected void onRestart() 
{ 
    super.onRestart(); 
    if(activities == 0){ 
     Log.i("APP","BACK FROM BACKGROUND"); 
    } 
} 

protected void onStop(){ 
    super.onStop(); 
    activities -= 1; 
} 

protected void onStart(){ 
    super.onStart(); 
    activities += 1; 
} 

}


所有的類都必須從這個類擴展這個工作。

+0

靜態變量可以在android下進行垃圾回收(沒有你注意到),當你按下主頁按鈕時可以重置靜態變量。這個實現是_guaranteed_在某些時候失敗。 – meredrica 2013-06-12 11:20:04

+0

就像你說的主頁按鈕可以將它設置回0,這正是你想要在這種情況下,當你走出整個應用程序,這是0,通常垃圾收集器刪除這個變量是更合理的,當你去到其他應用程序,然後當你返回這可能發生,但你又得到了你想要的確切結果(變量爲0)。但是你是對的,它也可能發生,即使在你自己的應用程序內部垃圾收集器可以刪除你的變量,但是我認爲這不是那種可能的情況。 – 2013-06-12 11:59:56

+0

這是一種可能的情況。只需使用一些2.2內存較低的手機並推送新的活動。 – meredrica 2013-06-12 17:05:26

相關問題