Проверьте, запущена ли функция из службы

Как Service может проверить, работает ли одна из приложений в приложении на переднем плане?

Solutions Collecting From Web of "Проверьте, запущена ли функция из службы"

Используйте метод ниже с именем вашего пакета. Он вернется, если какая-либо из ваших действий находится на переднем плане.

 public boolean isForeground(String myPackage) { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); ComponentName componentInfo = runningTaskInfo.get(0).topActivity; return componentInfo.getPackageName().equals(myPackage); } 

Обновить:

Добавить разрешение:

 <uses-permission android:name="android.permission.GET_TASKS" /> 

Начиная с Lollipop, getRunningTasks устарел:

  * <p><b>Note: this method is only intended for debugging and presenting * task management user interfaces</b>. This should never be used for * core logic in an application, such as deciding between different * behaviors based on the information found here.</p> * * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method * is no longer available to third party applications. 

Один из способов сделать это – привязать службу к началу приложения. Затем: 1. Если вам нужно проверить, работает ли какое-либо действие приложения, вы можете создать базовый класс для своих действий и переопределить onPause и onResume. В onPause вызовите метод службы, чтобы он знал, что он находится на заднем плане. В onResume вызовите метод сервиса, чтобы сообщить ему, что он находится на переднем плане. 2. Если вам нужно сделать это только для определенной деятельности, просто переопределите onResume и onPause в этих действиях или создайте базовую активность для этих действий.

Существует один недостаток большинства ответов выше, если у вашей деятельности есть функция, которая запускает другую деятельность сверху, например, отправляет электронное письмо

Введите описание изображения здесь

topActivity не вернет имя вашего пакета, а вместо него – имя пакета селектора активности Android.

Таким образом, лучше проверить baseActivity вместо topActivity .

 public boolean isMainActivityRunning(String packageName) { ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE); for (int i = 0; i < tasksInfo.size(); i++) { if (tasksInfo.get(i).baseActivity.getPackageName().toString().equals(packageName) return true; } return false; } 

Используйте SharedPreferences, чтобы сохранить статус вашего приложения в onResume, onPause и т. Д.

вот так:

  @Override public void onPause() { super.onPause(); PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit(); } @Override public void onDestroy() { super.onDestroy(); PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit(); } @Override public void onResume() { super.onResume(); PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", true).commit(); } 

А затем в службе:

 if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isActive", false)) { return; } 

Я использовал как onPause, так и onDestroy, потому что иногда он прыгает прямо на onDestroy 🙂 это в основном все voodoo

Во всяком случае, надеюсь, что это поможет кому-то

Я думаю, вы можете получить RunninTasks на Android и проверить с вашим именем пакета, если задача запущена или нет.

 public boolean isServiceRunning() { ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); isServiceFound = false; for (int i = 0; i < services.size(); i++) { if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) { isServiceFound = true; } } return isServiceFound; } 

Используйте метод ниже, чтобы получить полное имя класса (имя пакета + класса) текущей активности и проверить, равно ли оно полному имени класса (имя пакета + класса) требуемой активности:

  public String getCurrentClass() { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); ComponentName componentInfo = runningTaskInfo.get(0).topActivity; String className = componentInfo.getClassName(); return className; }