如何从服务检查活动是否在后台/前台运行?

时间:2014-02-18 10:13:31

标签: android android-activity service

我创建了一个服务,它从一个活动的onCreate开始,并在活动的onDestroy方法上停止。现在我必须从服务的方法中检查活动是否在前台/后台运行(对于某些情况,例如应用程序被强制关闭)。我怎么能这样做?

  1. 我需要这样做,因为我知道如果任何应用程序被强制关闭或任何类型的崩溃,无法保证调用活动的onDestroy方法。因此,我的活动启动时启动的服务不会在任何崩溃或任何有力的结束事件后停止。

  2. 我见过this link可以检查前台活动。但是我需要在任何状态(前景或后台)检查正在运行的活动

4 个答案:

答案 0 :(得分:12)

最终更新

检查所有活动:

@Override
protected void onStop() {
super.onStop();

    if (AppConstants.isAppSentToBackground(getApplicationContext())) {
        // Do what ever you want after app close simply Close session

    }
}

检查我们的应用是否正在运行的方法:

public static boolean isAppSentToBackground(final Context context) {

    try {
        ActivityManager am = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        // The first in the list of RunningTasks is always the foreground
        // task.
        RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
        String foregroundTaskPackageName = foregroundTaskInfo.topActivity
                .getPackageName();// get the top fore ground activity
        PackageManager pm = context.getPackageManager();
        PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(
                foregroundTaskPackageName, 0);

        String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo
                .loadLabel(pm).toString();

        // Log.e("", foregroundTaskAppName +"----------"+
        // foregroundTaskPackageName);
        if (!foregroundTaskAppName.equals("Your App name")) {
            return true;
        }
    } catch (Exception e) {
        Log.e("isAppSentToBackground", "" + e);
    }
    return false;
}

答案再次更新

将以下方法与您的包名一起使用。如果您的任何活动位于前台,它将返回true。

public boolean isForeground(String myPackage){
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
 List< ActivityManager.RunningTaskInfo > runningTaskInfo = am.getRunningTasks(1); 

     ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
   if(componentInfo.getPackageName().equals(myPackage)) return true;
return false;
}

回答已更新

首先检查此链接Checking if an Android application is running in the background

http://developer.android.com/guide/topics/fundamentals.html#lcycles是对Android应用程序生命周期的描述。

当活动进入后台时,会调用onPause()方法。因此,您可以在此方法中停用更新通知。

public static boolean isApplicationSentToBackground(final 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;
  }

在menifest中添加permisions

<uses-permission android:name="android.permission.GET_TASKS" />

答案 1 :(得分:7)

不幸的是,自Android API 21(Android Lollipop)以来,getRunningTasks()已被弃用:

  

这个方法在API级别21中已弃用。从LOLLIPOP开始,这个   方法不再适用于第三方应用程序:   引入以文档为中心的最近意味着它可以泄漏人   给呼叫者的信息。为了向后兼容,它仍然会   返回其数据的一小部分:至少是调用者自己的任务,   可能还有一些其他的任务,例如家里已知的不是   敏感。

答案 2 :(得分:0)

尝试使用此方法检查您的应用是否在后台:

public boolean isAppIsInBackground(Context context) {
        boolean isInBackground = true;
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
            List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (String activeProcess : processInfo.pkgList) {
                        if (activeProcess.equals(context.getPackageName())) {
                            isInBackground = false;
                        }
                    }
                }
            }
        } else {
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
            ComponentName componentInfo = taskInfo.get(0).topActivity;
            if (componentInfo.getPackageName().equals(context.getPackageName())) {
                isInBackground = false;
            }
        }

        return isInBackground;
    }

答案 3 :(得分:-3)

检查this链接&amp;特别检查答案显示这部分代码

public class MyApplication extends Application {

 public static boolean isActivityVisible() {
return activityVisible;
}  

public static void activityResumed() {
 activityVisible = true;
}

public static void activityPaused() {
activityVisible = false;
 }

private static boolean activityVisible;
}

希望这对你有所帮助。

相关问题