检测Android应用程序去背景

问题描述:

当我的应用程序“去背景”/“变为不活动”时,我需要关闭蓝牙。检测Android应用程序去背景

我试图在我的MainActivity的onPause()中做到这一点,但由于现在BT熄灭(Mainactivity的onPause()被触发),即使当我开始一个显示所选实体细节的新活动来自Mainactivity的项目。

我需要的是某种“onPause()”我的应用程序不是单一活动。

我认为没有这样的东西存在,所以有没有更好的解决方案?

+0

伙计,我已经遇到这个问题千倍,但其我们的不幸,没有这样的方法或事件存在..你必须找到解决它的方法。 –

+0

将它放在MainActivity的'onDestroy'和'onBackPressed'中,以便在用户关闭应用程序时关闭蓝牙。 –

+0

onDestroy()不是我正在寻找的,因为它可能需要时间才能使用此方法,因此它被称为 –

你可以参考这个问题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

至少到现在为止,它适用于多种活动。 –

您可以实现的onPause(活动你有,但我不认为它是需要自己关闭蓝牙,一些用户可能因为其他原因使用蓝牙,或他们想自己把它(这就是我所做的)

+1

这将无法正常工作,因为如果我离开主要活动并打开另一个活动(这是我的应用程序 –

+0

的一部分),您可能会尝试使用片段,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();

+0

你有这种方法的例子吗? –

+0

嗨,编辑过的主要回复,看下面的例子 – iflorit

+0

getRunningTasks在API级别21(Lollipop)中被弃用。该文件说不使用它,因为它可能会有“未来中断” – huync

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

不建议使用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 
}