3

有什么方法可以识别应用程序是从头开始(即尚未在内存中)还是从后台(已经打开应用程序并点击home按钮)?

4

4 回答 4

2

如果你真的是指 Application 而不是 Activity,那么你应该创建一个从 android.app.Application 对象派生的类,并在清单中声明这个类,以便能够通过覆盖的方法监视它的生命周期。每次您的应用程序从头开始时都会创建一个此类对象,因此如果您需要在应用程序生命周期中保存一些数据,则此对象或任何类型的单例都是一种很好的方法。

于 2012-05-31T09:23:26.907 回答
2

如果您只想知道 APP 何时从后台状态返回(当您返回家中或另一个应用程序并再次返回您的应用程序时)也许这可以帮助您。如果您发现不适用的情况,请告诉我。


public class FatherClass extends Activity {

      private static int activities = 0;

      public void onCreate(Bundle savedInstanceState, String clase) {
           super.onCreate(savedInstanceState);
      }

      protected void onRestart(){
           super.onRestart();
           if(activities == 0){
                 Log.i("APP","BACK FROM BACKGROUND");
           }
      }

      protected void onStop(){
           super.onStop();
           activities = activities - 1;
      }

      protected void onStart(){
           super.onStart();
           activities = activities + 1;
      }
}

您的所有活动都必须从这个扩展。

而且很简单,如果您的主要活动执行 onCreate() (您想要的活动中的方法,而不是我的示例中的 onCreate )并且您永远不会从另一个活动中调用它(将其视为启动屏幕),那么您就是从头开始,但是如果您的活动执行 onRestart() 并且计数器“活动”值是 0“零”,那么您正在从后台状态返回,我希望这可以帮助您并且不会为另一个人迟到。

于 2012-07-09T13:51:58.150 回答
1

整个代码应该写在一个应用程序特定的超级活动中

        boolean isForeground = isInForeground(this);

        if ((!hasFocus) && (!isForeground)) {
            context.isBackground = true;
            Log.v("Alalytics", "Background...");
        }
        else if (context.isBackground) {
            context.isBackground = false;
            Log.v("Alalytics", "Forground...");
        }

然后...创建方法来检查应用程序是前台还是后台的天气

/** * 检查应用程序是否在前台 * * @param context 上下文 * @return true,如果在前台 ** /

private boolean isInForeground(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
    if (appProcesses == null) {
        return false;
    }
    final String packageName = context.getPackageName();
    for (RunningAppProcessInfo appProcess : appProcesses) {
        if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                && appProcess.processName.equals(packageName)) {
            return true;
        }
    }
    return false;
}
于 2014-10-17T10:40:57.723 回答
0

由于声誉低,我无法添加评论,因此我将为 Reddy Raaz 添加新答案:这样您需要额外的权限,这可能会阻止某些用户安装该应用程序。框架只有在从头开始时才真正调用 Application.onCreate 方法。这样您就可以可靠地获取信息,而无需额外的许可。

于 2014-12-09T18:38:42.390 回答