检查android应用程序是否在前台?

hac*_*ker 102 android

我为这个问题找到了很多答案.但这都是关于单一活动的.如何检查整个应用程序是否在前台运行?

use*_*305 118

我不明白你想要什么,但你可以通过ActivityManager.getRunningAppProcesses()电话检测当前的前台/后台应用程序.

就像是,

class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {

  @Override
  protected Boolean doInBackground(Context... params) {
    final Context context = params[0].getApplicationContext();
    return isAppOnForeground(context);
  }

  private boolean isAppOnForeground(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;
  }
}

// Use like this:
boolean foregroud = new ForegroundCheckTask().execute(context).get();
Run Code Online (Sandbox Code Playgroud)

如果我误解了,也请告诉我.

更新:请查看此SO问题从后台任务或服务确定当前前台应用程序更多信息..

谢谢..

  • 这是我最初在[Android:应用程序在后台运行?](http://stackoverflow.com/q/3667022/648313)线程中提出的答案.然而事实证明它是不可靠的,而且[ActivityManager`用于后台/前景检查的用法是[由Android作者劝阻](https://groups.google.com/forum/#!msg/android-developers/zH-2bovZSLg/ L2YM8Z1N-HWJ).您可以查看我的以下答案以获取详细信息:http://stackoverflow.com/a/5862048/648313 (5认同)
  • 这需要清单中的特殊权限'GET_TASKS'.要求IMO这太过分了. (3认同)
  • 我每次都会收到来自服务器的通知..如果应用程序在前台运行,我不想在它在前台运行时显示该通知.. (2认同)

net*_*ein 41

@ user370305的答案很容易出错并且不被Android操作系统开发人员所阻止(请查看https://groups.google.com/forum/#!msg/android-developers/zH-2bovZSLg/L2YM8Z1N-HwJ)

有一个更简单的方法:

所有活动扩展BaseActivity上:

protected static boolean isVisible = false;

@Override
public void onResume() {
   super.onResume();
   setVisible(true);
}

@Override
public void onPause() {
    super.onPause();
    setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)

每当您需要检查您的任何应用程序活动是否在前台时,只需检查 isVisible();

要了解此方法,请检查并行活动生命周期的答案:活动并行生命周期

  • 如果切换活动,也会调用此方法! (4认同)
  • 这确实可以查看活动是处于前台还是后台 (2认同)

ces*_*rds 38

到目前为止我发现的最新且未被弃用的方式如下:

@Override
public boolean foregrounded() {
    ActivityManager.RunningAppProcessInfo appProcessInfo = new ActivityManager.RunningAppProcessInfo();
    ActivityManager.getMyMemoryState(appProcessInfo);
    return (appProcessInfo.importance == IMPORTANCE_FOREGROUND || appProcessInfo.importance == IMPORTANCE_VISIBLE)
}
Run Code Online (Sandbox Code Playgroud)

它仅适用于SDK 16+.

编辑:

我从解决方案中删除了以下代码:

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
// App is foreground, but screen is locked, so show notification
return km.inKeyguardRestrictedInputMode();
Run Code Online (Sandbox Code Playgroud)

因为如果屏幕锁定,则不会收到通知.我看一下框架,目的并不完全清楚.我会删除它.检查进程信息状态就足够了:-)

  • 来吧,伙计们一点也不差,2017年的API 16+意味着99%以上 (6认同)

mht*_*ani 18

借助全新的Android生命周期扩展架构,我们可以轻松实现这一目标.

只需确保在build.gradle文件中提取此依赖项:

dependencies {
    implementation "android.arch.lifecycle:extensions:1.1.0"
}
Run Code Online (Sandbox Code Playgroud)

然后在您的Application类中,使用:

class ArchLifecycleApp : Application(), LifecycleObserver {

    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onAppBackgrounded() {
        Log.d("MyApp", "App in background")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onAppForegrounded() {
        Log.d("MyApp", "App in foreground")
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,使用以下命令更新AndroidManifest.xml文件:

<application
    android:name=".ArchLifecycleApp"
    //Your extra code
    ....>
</application>
Run Code Online (Sandbox Code Playgroud)

现在,每次Application转到Foreground或Background时,我们都会收到与声明的两个方法相关的Logs.

  • 这并不总是有效。需要首先调用它以确定它是否在前台。例如,尝试在其 `onCreate` 函数中检查类 `ArchLifecycleApp`,无论它是否在前台。 (2认同)
  • 在 AndroidX 中,该库现在称为 androidx.lifecycle:lifecycle-extensions (2认同)

Jit*_*iya 10

我尝试过运行过程中的包过滤器.但这很奇怪.而不是那样,我尝试了新的解决方案,这完美.我已多次检查并通过此模块获得完美结果.

private int numRunningActivities = 0;

 public void onCreate() {
        super.onCreate();
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

                @Override
                public void onActivityStarted(Activity activity) {
                    numRunningActivities++;
                    if (numRunningActivities == 1) {
                        LogUtils.d("APPLICATION", "APP IN FOREGROUND");
                    }

                }

                @Override
                public void onActivityStopped(Activity activity) {

                    numRunningActivities--;
                    if (numRunningActivities == 0) {
                       Log.e("", "App is in BACKGROUND") 
                    }
                }


                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
                }

                @Override
                public void onActivityResumed(Activity activity) {
                }

                @Override
                public void onActivityPaused(Activity activity) {
                }

                @Override
                public void onActivityDestroyed(Activity activity) {
                }

                @Override
                public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                }
            });
}
Run Code Online (Sandbox Code Playgroud)


S.S*_*iya 9

检查应用程序是在后台还是前台.如果应用程序在后台,此方法将返回true.

首先将GET_TASKS权限添加到AndroidManifest.xml

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

  • GET_TASKS 已弃用 (2认同)

小智 6

您可以使用ProcessLifecycleOwner使用Android体系结构组件库为onStart和onStop事件设置整个应用程序过程的侦听器。为此,使您的应用程序类实现LifecycleObserver接口,并为前景和后台方法添加onStop和onStart的一些注释。

class ArchLifecycleApp : Application(), LifecycleObserver {

    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onAppBackgrounded() {
        Log.d("Awww", "App in background")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onAppForegrounded() {
        Log.d("Yeeey", "App in foreground")
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 使用“implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"”作为应用程序 build.gradle 中的依赖项。 (2认同)

归档时间:

查看次数:

115550 次

最近记录:

7 年,5 月 前