2012-03-29 29 views
2

嗨,大家好,我用這個方法來檢查,如果我的應用程序在後臺與否:檢查時,我的應用程序在後臺時後退按鈕和家庭按鈕

public static boolean isApplicationSentToBackground(final Context context) { 
    ActivityManager am = (ActivityManager) context 
      .getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = am.getRunningTasks(1); 
    for(RunningTaskInfo rti: tasks) { 
     ComponentName cn = rti.topActivity; 
     LogHelper.i(TAG, "Component Name: " + cn.getPackageName()); 
    } 



    if (!tasks.isEmpty()) { 
     ComponentName topActivity = tasks.get(0).topActivity; 
     if (!topActivity.getPackageName().equals(context.getPackageName())) { 
      return true; 
     } 
    } 

    return false; 
} 

我調用此方法在我的活動的onPause,的onStop,的onDestroy 這些是我的結果:

當我在我的活動,我點擊Android的家庭按鈕,它遵循這一流程:

的onPause - >是在後臺? true onStop - >在後臺?真

它是完美的。 問題是當我點擊從活動返回到Android主頁的android-back-button時。這是流程:

onPause - >是否在後臺? false onStop - >在後臺?假 onDestroy - >在後臺?假

如果你檢查我有一個登錄貓郵票,它總是(在後退按鈕的情況下)的代碼杜絕這樣的:

03-29 00:46:39.324:I/DFFramework(15344) :MusicUtils - 組件名稱:my-activity-name

這意味着我的活動不在後臺。 我能做什麼?

更新:

我正在添加更多關於我的方案的信息。我正在開發音樂播放器,因此如果應用程序關閉但音樂仍在播放(否則音樂將被暫停),我必須捕獲此類事件以啓動前臺音頻服務。因此我必須在應用程序處於後臺(比如當您單擊android-home-button時)或關閉應用程序時(例如,當您單擊android-back-button時)捕獲它。

回答

1

爲什麼要這麼做? 「在後臺」對你來說意味着什麼?從活動角度來看,您的應用程序或者處於活動狀態(例如,OnResume已被調用),已暫停(已調用OnPaused)或已死亡(已調用OnDestroy)。

在暫停狀態下,您一般不應做任何工作。您的應用已暫停,爲需要系統資源的不同應用提供幫助。

如果你需要確保某些東西在後臺運行,那麼你很可能需要一個服務,儘管使用在後臺運行很長時間的服務通常是不好的形式,除非你正在構建一些東西比如音樂播放器。

所以根據你的評論你正在建立一個音樂播放器。現在音樂播放器有兩種模式:

  1. 無論是用戶與它進行交互,而音樂播放
  2. 音樂在後臺播放。

使用音樂播放服務使其可以獨立於控制音樂播放器(活動)的任務運行是有意義的。當用戶點擊返回時,該活動將被破壞,當用戶點擊主頁按鈕或接到電話,鎖定屏幕等時,活動將暫停。

現在很容易檢測到這些情況。如果活動暫停,這意味着用戶正在做其他事情。然後你應該確保你的音樂繼續播放。 Android爲此提供startForeground,這意味着系統只會將其作爲最後手段殺死它。因此,在您的活動的OnPause中,您應該通知該服務並將其置於前臺模式,該模式還會顯示通知。

當用戶完成OnDestroy中的活動時,您可以執行相同的操作。

剩下的唯一事情就是確保在OnResume中再次啓動活動時再致電stopForeground

我建議您閱讀Android架構,以瞭解不同的組件和生命週期如何工作。再次,應該有一個理由來檢查您的應用程序是否「在後臺」,就像您現在要做的那樣。

+0

好問題botteaap。我正在開發音樂播放器,我正在嘗試遵循Google音樂模式。當您正在播放歌曲並且您在應用程序中時Google Music未顯示播放歌曲的通知。當您點擊主頁按鈕(谷歌音樂應用程序在後臺)時,它會顯示通知。我已經這樣做了,但是當你點擊後退按鈕並返回到Android主屏幕時,問題仍然存在。在這種情況下,我的應用程序不會去背景,你可以看到... – StErMi 2012-03-29 12:45:24

+0

我編輯了我的答案,希望它有幫助。您還可以查看音樂應用的Android源代碼,看看它們在那裏如何實現。 – botteaap 2012-03-29 13:18:57

+0

botteaap我已經使用音樂播放器的源代碼作爲操場/書房,事實上一切正常。但是,當一首歌被播放時,類似的音樂播放器(舊的播放器)開始播放通知,而不是播放歌曲並且該應用程序處於後臺播放時,這會浪費大量資源和時間。正如我所說我已經使用該方法檢查我的onPause,並且它在單擊home按鈕時正在工作,但onPause和onDestroy總是在一個活動被銷燬時被調用,並且當您返回時或者當您正在遍歷應用程序內。 – StErMi 2012-03-29 13:34:28

相關問題