2010-07-13 102 views
3

我如何知道我的应用程序已置于后台(即,我的应用程序的任何活动都不再可见)?我需要确定这一点,以便我可以释放我的几个活动(图形,声音剪辑和套接字连接)之间共享的资源。确定应用程序是否在后台运行

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

+2

可能的重复http://stackoverflow.com/questions/3136187/how-to-detect-if-any-of-my-activity-is-front-most-and-visible-to-user – Pentium10 2010-07-13 11:57:01

回答

0

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

我认为处理像您这样的场景的Android方式是在service中管理您的连接状态,并使用持久存储来监视应用程序状态。

+0

使用服务这似乎有点重量级。此外,它不仅仅是一个需要发布的连接,还有其他资源在我的活动中共享,比如图形和声音剪辑,当我的应用在后台运行时我会发布这些资源(我会将其编辑为我的题)。 当然,计数器不会保存在Activity实例变量中。它可能会生活在我的应用程序中的自定义应用程序类中,这当然会持续应用程序的整个生命周期。 – Haakon 2010-07-13 11:59:10

0

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

+0

这不是架构的必要问题。只要应用程序来自后台,您就希望拥有插页式广告的图像。那么这不是一个持久的资源问题,而是要找出应用程序生命周期中发生的事情。 – middlehut 2013-11-28 09:40:49

2

你不应该需要知道这一点,但要回答你:

在主要活动:

public boolean inBackground; 

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

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

我还没试过此我自己,但我想下面会工作。

  • 创建您自己的定制活动类extends Activity(如建议in this SO question)。
  • 确保所有活动都扩展您的自定义活动类。 (请按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}时,按Home键退出应用程序似乎工作正常。但是,当使用后退按钮退出应用程序时(它仍认为我的应用程序正在运行),代码不会像后台一样检测应用程序。

通过在顶级活动中重写onDestroy()并检查isFinished()以确认应用程序正在被销毁(而不是重新创建活动,例如对于方向更改),可以检测到此情形。

相关问题