如何判断我的应用程序是否已放入后台(即我的应用程序的任何活动都不再可见)?我需要确定这一点,以便我可以释放我的几个活动(图形,声音片段和套接字连接)之间共享的资源。
我考虑过保持一个全局计数器,它在活动'onStart()方法中递增,并在onStop()中递减。如果计数器达到零,则所有活动都已停止,我的应用程序在后台运行。但是我不确定这是否100%可靠。此外,我不禁想到必须有更好的方法来做到这一点。
答案 0 :(得分:2)
你不应该知道这一点,而是要回答你:
在您的主要活动中:
public boolean inBackground;
@Override
public void onPause()
{
inBackground=true;
super.onPause();
}
@Override
public void onResume()
{
inBackground=false;
super.onResume();
}
答案 1 :(得分:1)
你是不是在OnPause()/ OnResume()事件之后?
http://developer.android.com/reference/android/app/Activity.html#onPause()
http://developer.android.com/reference/android/app/Activity.html#onResume()
有关概述,请参阅http://developer.android.com/guide/topics/fundamentals.html#lcycles。
答案 2 :(得分:0)
您可以使用全局计数器,假设它保存在持久存储中。请记住,基于来自其他应用程序的压力,系统可以从设备RAM免费unload and reload activities,因此活动的实例变量可能不是容纳这些数据的好选择。
我认为Android处理类似方案的方式是在service中管理连接状态,并使用持久存储来监控应用程序状态。
答案 3 :(得分:0)
如果您需要此功能,可能您的架构设计不合理。每个活动必须以某种方式“独立”,因此当它停止时,释放与之关联的任何数据。如果您需要在活动之间存储一些持久性数据,请使用sql或其他一些数据存储,如果您需要在活动之间使用某些共享资源,请将它们投入使用。尝试隔离活动之间的任何耦合。
答案 4 :(得分:0)
我自己还没有尝试过,但我认为以下方法可行。
extends Activity
(建议in this SO question)。 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()
以确认应用程序正在被销毁(而不是重新创建的活动,例如更改方向)