當我的應用程序「去背景」/「變爲不活動」時,我需要關閉藍牙。檢測Android應用程序去背景
我試圖在我的MainActivity的onPause()中做到這一點,但由於現在BT熄滅(Mainactivity的onPause()被觸發),即使當我開始一個顯示所選實體細節的新活動來自Mainactivity的項目。
我需要的是某種「onPause()」我的應用程序不是單一活動。
我認爲沒有這樣的東西存在,所以有沒有更好的解決方案?
當我的應用程序「去背景」/「變爲不活動」時,我需要關閉藍牙。檢測Android應用程序去背景
我試圖在我的MainActivity的onPause()中做到這一點,但由於現在BT熄滅(Mainactivity的onPause()被觸發),即使當我開始一個顯示所選實體細節的新活動來自Mainactivity的項目。
我需要的是某種「onPause()」我的應用程序不是單一活動。
我認爲沒有這樣的東西存在,所以有沒有更好的解決方案?
你可以參考這個問題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;
}
它不適用於多個活動應用程序 – iflorit
至少到現在爲止,它適用於多種活動。 –
您可以實現的onPause(活動你有,但我不認爲它是需要自己關閉藍牙,一些用戶可能因爲其他原因使用藍牙,或他們想自己把它(這就是我所做的)
這將無法正常工作,因爲如果我離開主要活動並打開另一個活動(這是我的應用程序 –
的一部分),您可能會嘗試使用片段,BT會關閉?它們可以表現得像活動一樣,你可以將它們包含在一個單獨的活動中,當onPause()被調用時,它會轉動藍牙。 – TomTsagk
對於不是單一的活動應用程序,我會建議每個活動都實施基於時間的控制能見度。在每個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();
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延伸活動,把這個代碼,並讓所有的活動擴展此類。
這不起作用,當通過後退按鈕恢復活動或從另一個活動輸入活動時,這也會觸發 – commonSenseCode
跟蹤活動計數的缺陷是旋轉。通常,在新配置的新活動出現之前,正在下降的活動會完全結束,導致不正確的後臺 - >前臺轉換檢測。 – bduhbya
不建議使用RunningTaskInfo
,因爲它的「方法僅用於調試和顯示任務管理用戶界面」。好吧,如果你正在開發應用程序ICS和以上,我發現這個鏈接非常有用!
http://vardhan-justlikethat.blogspot.in/2013/05/android-solution-to-detect-when-android.html
要檢測應用程序將背景下,覆蓋在下面的應用程序類應用程式的方法:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
//called when app goes to background
}
夥計,我已經遇到這個問題千倍,但其我們的不幸,沒有這樣的方法或事件存在..你必須找到解決它的方法。 –
將它放在MainActivity的'onDestroy'和'onBackPressed'中,以便在用戶關閉應用程序時關閉藍牙。 –
onDestroy()不是我正在尋找的,因爲它可能需要時間才能使用此方法,因此它被稱爲 –