检查应用程序是在前台还是后台运行(使用同步适配器)

我知道这是一个重复的问题,但我已经看遍了所有的地方,找不到解决方案,适合我这么…

我有一个从TMDB API获取电影数据的应用程序,它使用同步适配器通过页面获取它,基本上它运行的很好,除非当应用程序打开时用户不在第一页时同步适配器的定期同步被运行,所以我的选择是强制更新电影列表,并将用户发送到列表的顶部,这是完全不好的经验,所以不被视为一种选择,或者我可以检查应用程序是否正在运行,无论是在前台或在应用程序堆栈,它是不可见的用户仍然在运行,所以最好的我可以通过搜索得到这段代码:

public static boolean isAppRunning(final Context context, final String packageName) { final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); final List procInfos = activityManager.getRunningAppProcesses(); if (procInfos != null) { for (final ActivityManager.RunningAppProcessInfo processInfo : procInfos) { if (processInfo.processName.equals(packageName)) return true; } } return false; } 

但无论什么原因,它不能正常工作,看到应用程序运行,即使我通过刷卡杀死它,起初我以为是因为我有一个同步适配器,可以被视为应用程序运行,所以我用另一个进程它在清单中使用

 android:process=":service" 

但它没有工作

还想过在活动的onStart和onStop中使用variables,但不能保证在应用程序关闭或死亡时将调用onStop,以避免此方法

这是我的manifest.xml

                                             

那么,有什么想法? 提前致谢

我们调整了你的想法,并提出了这个(在Kotlin,见下面的Java):

 fun appInForeground(context: Context): Boolean { val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val runningAppProcesses = activityManager.runningAppProcesses ?: return false return runningAppProcesses.any { it.processName == context.packageName && it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND } } 

这在Java中是相当的:

 private boolean appInForeground(@NonNull Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List runningAppProcesses = activityManager.getRunningAppProcesses(); if (runningAppProcesses == null) { return false; } for (ActivityManager.RunningAppProcessInfo runningAppProcess : runningAppProcesses) { if (runningAppProcess.processName.equals(context.getPackageName()) && runningAppProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; } 

这是相关的文件。