确定应用程序是否在后台运行

时间:2010-07-13 11:39:17

标签: android android-activity

如何判断我的应用程序是否已放入后台(即我的应用程序的任何活动都不再可见)?我需要确定这一点,以便我可以释放我的几个活动(图形,声音片段和套接字连接)之间共享的资源。

我考虑过保持一个全局计数器,它在活动'onStart()方法中递增,并在onStop()中递减。如果计数器达到零,则所有活动都已停止,我的应用程序在后台运行。但是我不确定这是否100%可靠。此外,我不禁想到必须有更好的方法来做到这一点。

5 个答案:

答案 0 :(得分:2)

你不应该知道这一点,而是要回答你:

在您的主要活动中:

public boolean inBackground;

@Override
public void onPause()
{
     inBackground=true;
     super.onPause();
}

@Override
public void onResume()
{
     inBackground=false;
     super.onResume();
}

答案 1 :(得分:1)

答案 2 :(得分:0)

您可以使用全局计数器,假设它保存在持久存储中。请记住,基于来自其他应用程序的压力,系统可以从设备RAM免费unload and reload activities,因此活动的实例变量可能不是容纳这些数据的好选择。

我认为Android处理类似方案的方式是在service中管理连接状态,并使用持久存储来监控应用程序状态。

答案 3 :(得分:0)

如果您需要此功能,可能您的架构设计不合理。每个活动必须以某种方式“独立”,因此当它停止时,释放与之关联的任何数据。如果您需要在活动之间存储一些持久性数据,请使用sql或其他一些数据存储,如果您需要在活动之间使用某些共享资源,请将它们投入使用。尝试隔离活动之间的任何耦合。

答案 4 :(得分:0)

我自己还没有尝试过,但我认为以下方法可行。

  • 创建自己的自定义活动类extends Activity(建议in this SO question)。
  • 确保您的所有活动扩展自定义Activity类。
  • @Override onStop()方法(根据Activity life cycle docs)。
  • onStop()调用下面的实用程序方法(基于Droid-Fu project的代码)来确定您的应用程序现在是否在后台。

我担心的是,当你的上一个活动在新活动(也是你的应用程序)启动之前关闭时,可能会有一些时间窗口,但希望这是可以避免的。

public static boolean isApplicationInBackground(Context context) 
{
    ActivityManager am = 
      (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningTaskInfo> tasks = am.getRunningTasks(1);

    if (!tasks.isEmpty()) 
    {
        ComponentName topActivity = tasks.get(0).topActivity;

        if (!topActivity.getPackageName().equals(context.getPackageName())) 
        {
            return true;
        }
    }

    return false;
}

请告诉我们您是如何继续实施此功能的!

更新:我已经对此代码进行了一些快速测试。

当按下主页键退出应用程序时似乎工作正常,因为正在运行的任务更改为我的设备上的ComponentInfo{com.motorola.blur.home/com.motorola.blur.home.HomeActivity}。但是,当使用后退按钮退出应用程序时,代码不会像在后台检测到应用程序(它仍然认为我的应用程序正在运行)。

可以通过覆盖顶级活动中的onDestroy()来检测此方案,并检查isFinished()以确认应用程序正在被销毁(而不是重新创建的活动,例如更改方向)