2013-12-09 86 views
6

當我的應用程序「去背景」/「變爲不活動」時,我需要關閉藍牙。檢測Android應用程序去背景

我試圖在我的MainActivity的onPause()中做到這一點,但由於現在BT熄滅(Mainactivity的onPause()被觸發),即使當我開始一個顯示所選實體細節的新活動來自Mainactivity的項目。

我需要的是某種「onPause()」我的應用程序不是單一活動。

我認爲沒有這樣的東西存在,所以有沒有更好的解決方案?

+0

夥計,我已經遇到這個問題千倍,但其我們的不幸,沒有這樣的方法或事件存在..你必須找到解決它的方法。 –

+0

將它放在MainActivity的'onDestroy'和'onBackPressed'中,以便在用戶關閉應用程序時關閉藍牙。 –

+0

onDestroy()不是我正在尋找的,因爲它可能需要時間才能使用此方法,因此它被稱爲 –

回答

2

你可以參考這個問題How to detect when an Android app goes to the background and come back to the foreground誰回答了這個使用onFocuschanged不知道有多少有效的就是這種方法解決了這個傢伙,反正保持在谷歌

)在每個研究
private boolean isApplicationBroughtToBackground() { 
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List tasks = am.getRunningTasks(1); 
    if (!tasks.isEmpty()) { 
     ComponentName topActivity = tasks.get(0).topActivity; 
     if (!topActivity.getPackageName().equals(context.getPackageName())) { 
      return true; 
     } 
    } 

    return false; 
} 
+0

它不適用於多個活動應用程序 – iflorit

+0

至少到現在爲止,它適用於多種活動。 –

1

您可以實現的onPause(活動你有,但我不認爲它是需要自己關閉藍牙,一些用戶可能因爲其他原因使用藍牙,或他們想自己把它(這就是我所做的)

+1

這將無法正常工作,因爲如果我離開主要活動並打開另一個活動(這是我的應用程序 –

+0

的一部分),您可能會嘗試使用片段,BT會關閉?它們可以表現得像活動一樣,你可以將它們包含在一個單獨的活動中,當onPause()被調用時,它會轉動藍牙。 – TomTsagk

2

對於不是單一的活動應用程序,我會建議每個活動都實施基於時間的控制能見度。在每個onPause()啓動一個定時狀態檢查器,並在每個onResume()方法上取消該定時器。

下面的例子

@Override 
protected void onPause() { 
    TimerTask backgroundCheck = new TimerTask() { 

     @Override 
     public void run() { 
      ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
      List<RunningTaskInfo> tasks = am.getRunningTasks(1); 
      if (!tasks.isEmpty()) { 
       ComponentName topActivity = tasks.get(0).topActivity; 
       if (!topActivity.getPackageName().equals(getApplicationContext().getPackageName())) { 
        // APP in background, do something 
       } 
      } 

      // APP in foreground, do something else 
     } 
    }; 

    Timer isBackgroundChecker = new Timer(); 
    isBackgroundChecker.schedule(backgroundCheck, 1000, 1000); 

    super.onPause(); 
} 

實現在此之後,記得要取消Timer isBackgroundChecker = new Timer();

+0

你有這種方法的例子嗎? –

+0

嗨,編輯過的主要回復,看下面的例子 – iflorit

+0

getRunningTasks在API級別21(Lollipop)中被棄用。該文件說不使用它,因爲它可能會有「未來中斷」 – huync

8

UPDATE:當心,根據本評論並非在所有情況下工作!

這裏列出的解決方案似乎對我來說太複雜了。我想出了這個:

創建靜態變量可以從您的所有活動訪問,以檢測當前正在運行的活動的數量。

public class SharedData { 
    static int runningActivities = 0; 
} 

在每個活動中重寫這兩個方法。

public void onStart() { 
    super.onStart(); 
    if (SharedData.runningActivities == 0) { 
     // app enters foreground 
    } 
    SharedData.runningActivities++; 
} 

public void onStop() { 
    super.onStop(); 
    SharedData.runningActivities--; 
    if (SharedData.runningActivities == 0) { 
     // app goes to background 
    } 
} 

您可以創建MyActivity延伸活動,把這個代碼,並讓所有的活動擴展此類。

+1

這不起作用,當通過後退按鈕恢復活動或從另一個活動輸入活動時,這也會觸發 – commonSenseCode

+0

跟蹤活動計數的缺陷是旋轉。通常,在新配置的新活動出現之前,正在下降的活動會完全結束,導致不正確的後臺 - >前臺轉換檢測。 – bduhbya

2

要檢測應用程序將背景下,覆蓋在下面的應用程序類應用程式的方法:

@Override 
public void onTrimMemory(int level) { 
    super.onTrimMemory(level); 
    if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) 
     //called when app goes to background 
}