检测Android应用程序去背景
当我的应用程序“去背景”/“变为不活动”时,我需要关闭蓝牙。检测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()不是我正在寻找的,因为它可能需要时间才能使用此方法,因此它被称为 –