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

Cra*_*ner 6 service android android-activity

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

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

  2. 我已经看到了可以检查前台活动的链接.但我需要在任何状态(前景或后台)检查正在运行的活动

Has*_*ani 12

最后更新

检查所有活动:

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

答案再次更新

将以下方法与您的包名一起使用.如果您的任何活动位于前台,它将返回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;
}
Run Code Online (Sandbox Code Playgroud)

答案已更新

首先检查此链接检查Android应用程序是否在后台运行

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;
  }
Run Code Online (Sandbox Code Playgroud)

在清单中加入permisions

<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)


Sam*_* Lu 7

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

此方法在API级别21中已弃用.自LOLLIPOP起,此方法不再适用于第三方应用程序:引入以文档为中心的最近时间意味着它可能会将人员信息泄漏给调用方.为了向后兼容,它仍将返回其数据的一小部分:至少是调用者自己的任务,以及可能已知不敏感的其他一些任务,如home.

  • 如果我错了,请纠正我,但问题是关于在同一个应用程序中检查某个服务的活动,那么"至少调用者自己的任务"不会涵盖这个问题吗? (2认同)