Android 当应用程序进入后台时启动服务

Android 当应用程序进入后台时启动服务,android,android-service,Android,Android Service,我有一个带有一些活动的应用程序,还有一个应该在整个应用程序进入后台时启动的服务。 现在,我在主活动调用onStop方法时启动服务,但在我启动应用程序的新活动时也会调用此方法(在这种情况下,服务不应启动)。 有一种方法可以检查我的应用程序(不是特定的活动)何时进入后台,或者我需要为每个活动检查它 private boolean isApplicationBroughtToBackground() { ActivityManager am = (ActivityManager) contex

我有一个带有一些活动的应用程序,还有一个应该在整个应用程序进入后台时启动的服务。 现在,我在主活动调用onStop方法时启动服务,但在我启动应用程序的新活动时也会调用此方法(在这种情况下,服务不应启动)。 有一种方法可以检查我的应用程序(不是特定的活动)何时进入后台,或者我需要为每个活动检查它

private boolean isApplicationBroughtToBackground() {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List tasks = am.getRunningTasks(1);
    if (!tasks.isEmpty()) {
        ComponentName topActivity = tasks.get(0).topActivity;
        if (!topActivity.getPackageName().equals(context.getPackageName())) {
            return true;
        }
    }

    return false;
}

有关更多信息,您必须为此创建一个应用程序级类,并为我向您展示的每个屏幕或活动设置布尔值

public class MyApplication extends Application {

private static boolean mainActivityVisible;

public static boolean isMainActivityVisible() {
    return mainActivityVisible;
}  

public static void mainActivityResumed() {
    mainActivityVisible = true;
}

public static void mainActivityPaused() {
    mainActivityVisible = false;
}
}

然后在主要活动中

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    MyApplication.mainActivityPaused();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    MyApplication.mainActivityResumed();
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
  if(isAppRunning(context))
    {
        if(MyApplication.isMainActivityVisible())
        {
           //Means activity not in background so dont start service or broadcasting
        }
        else
        {
          //Means activity is in background so start service here..
         } 
    }
    else
    {
       //Means app is not alive...so start also service here
    }
}
方法正在此处运行

public static boolean isAppRunning(Context context) {
    // check with the first task(task in the foreground)
    // in the returned list of tasks
    ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> services = activityManager
.getRunningTasks(Integer.MAX_VALUE);
    if (services.get(0).topActivity.getPackageName().toString()
.equalsIgnoreCase(context.getPackageName().toString())) 
    {
        return true;
    }
    return false;
}
publicstaticbooleaninsapprunning(上下文){
//检查第一个任务(前台任务)
//在返回的任务列表中
ActivityManager ActivityManager=(ActivityManager)上下文
.getSystemService(Context.ACTIVITY\u服务);
列表服务=活动管理器
.getRunningTasks(整数.MAX_值);
if(services.get(0.topActivity.getPackageName().toString())
.equalsIgnoreCase(context.getPackageName().toString())
{
返回true;
}
返回false;
}

在这种情况下,不应启动服务…错误。。。你应该开始服务。。。。服务应该做所有的工作。。。活动应仅显示UI(绑定服务并使用它)。。。我的假设是,你在活动和服务中有几乎相同的代码,你想启动服务以“某些东西”继续工作……如果我的应用程序不在后台,我不应该启动服务。如果我的应用程序在前台,我已经有一个异步任务来完成这项工作。当应用程序进入后台时,我需要启动服务,若某些条件得到验证,则在状态栏中显示通知。