我如何知道我的应用程序已置于后台(即,我的应用程序的任何活动都不再可见)?我需要确定这一点,以便我可以释放我的几个活动(图形,声音剪辑和套接字连接)之间共享的资源。确定应用程序是否在后台运行
我想过保留一个全局计数器,它在活动的onStart()方法中递增,并在onStop()中递减。如果计数器达到零,则所有活动都已停止,并且我的应用程序正在后台运行。但我不确定这是否会100%可靠。另外,我不禁想到,这样做肯定有更好的方法。
我如何知道我的应用程序已置于后台(即,我的应用程序的任何活动都不再可见)?我需要确定这一点,以便我可以释放我的几个活动(图形,声音剪辑和套接字连接)之间共享的资源。确定应用程序是否在后台运行
我想过保留一个全局计数器,它在活动的onStart()方法中递增,并在onStop()中递减。如果计数器达到零,则所有活动都已停止,并且我的应用程序正在后台运行。但我不确定这是否会100%可靠。另外,我不禁想到,这样做肯定有更好的方法。
您可以使用全局计数器,假设它保存在持久存储中。请始终记住,基于来自其他应用程序的压力,系统可从设备RAM免费获得unload and reload activities,因此活动的实例变量可能不是存放该数据的理想选择。
我认为处理像您这样的场景的Android方式是在service中管理您的连接状态,并使用持久存储来监视应用程序状态。
使用服务这似乎有点重量级。此外,它不仅仅是一个需要发布的连接,还有其他资源在我的活动中共享,比如图形和声音剪辑,当我的应用在后台运行时我会发布这些资源(我会将其编辑为我的题)。 当然,计数器不会保存在Activity实例变量中。它可能会生活在我的应用程序中的自定义应用程序类中,这当然会持续应用程序的整个生命周期。 – Haakon 2010-07-13 11:59:10
如果您需要此功能,也许您的架构设计得不好。每个活动必须以某种方式“独立”,因此停止发布与其关联的任何数据。如果您需要在活动之间存储一些持久数据,请使用sql或其他数据存储,并且如果您需要活动之间的某些共享资源,则可以将它们投入使用。尝试隔离活动之间的任何耦合。
这不是架构的必要问题。只要应用程序来自后台,您就希望拥有插页式广告的图像。那么这不是一个持久的资源问题,而是要找出应用程序生命周期中发生的事情。 – middlehut 2013-11-28 09:40:49
你不应该需要知道这一点,但要回答你:
在主要活动:
public boolean inBackground;
@Override
public void onPause()
{
inBackground=true;
super.onPause();
}
@Override
public void onResume()
{
inBackground=false;
super.onResume();
}
我还没试过此我自己,但我想下面会工作。
extends Activity
(如建议in this SO question)。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()
以确认应用程序正在被销毁(而不是重新创建活动,例如对于方向更改),可以检测到此情形。
可能的重复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