如何检查android中的活动是在前台还是后台?

时间:2016-05-19 06:59:16

标签: android

我有一个活动,在onCreate方法中我必须检查活动是在前台还是后台。如果活动在前台,那么我必须向服务器发送请求,如果应用程序进入后台,那么我必须发送服务器请求通过Intent服务。我怎么能这样做。

如果应用程序进入前台的后台停止服务器请求,是否有任何方法。

5 个答案:

答案 0 :(得分:1)

尝试使用此功能检查您的应用是否在前台

public static boolean isAppInForeground(Context ctx) {
    ActivityManager activityManager = (ActivityManager) ctx
            .getApplicationContext().getSystemService(
                    Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> services = activityManager
            .getRunningTasks(Integer.MAX_VALUE);

    if (services == null) {
        return false;
    }

    if (services.size() > 0
            && services.get(0).topActivity
                    .getPackageName()
                    .toString()
                    .equalsIgnoreCase(
                            ctx.getApplicationContext().getPackageName()
                                    .toString())) {
        return true;
    }

    return false;
}

答案 1 :(得分:1)

使用 Activity.onPause,Activity.onResume 方法自行跟踪应用程序的可见性。

示例实现自定义应用程序类:

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;
}

AndroidManifest.xml

中注册您的申请类

然后是这样的:

@Override
protected void onResume() {
  super.onResume();
  MyApplication.activityResumed();
}

@Override
protected void onPause() {
  super.onPause();
  MyApplication.activityPaused();
}

答案 2 :(得分:1)

最好的方法是你应该在你的活动的onStop()调用中触发你的服务,因为服务启动onStatCommand()中的逻辑将被执行,如果你想你的服务不应该依赖于应用程序生命周期返回在onStatCommand()中使用START_STICKY。

答案 3 :(得分:1)

以下是使用Application类的解决方案。

public class AppSingleton extends Application implements Application.ActivityLifecycleCallbacks {

private WeakReference<Context> foregroundActivity;


@Override
public void onActivityResumed(Activity activity) {
    foregroundActivity=new WeakReference<Context>(activity);
}

@Override
public void onActivityPaused(Activity activity) {
    String class_name_activity=activity.getClass().getCanonicalName();
    if (foregroundActivity != null && 
            foregroundActivity.get().getClass().getCanonicalName().equals(class_name_activity)) {
        foregroundActivity = null;
    }
}

//............................

public boolean isOnForeground(@NonNull Context activity_cntxt) {
    return isOnForeground(activity_cntxt.getClass().getCanonicalName());
}

public boolean isOnForeground(@NonNull String activity_canonical_name) {
    if (foregroundActivity != null && foregroundActivity.get() != null) {
        return foregroundActivity.get().getClass().getCanonicalName().equals(activity_canonical_name);
    }
    return false;
}
}

如果您有对所需活动的引用或使用活动的规范名称,您可以查明它是否在前台。这个解决方案可能不是万无一失的。因此,您的评论非常受欢迎。

答案 4 :(得分:-1)

检查this库。它可以跟踪当前的活动状态。