Как можно Service
проверить, работает ли одно из приложений Activity
на переднем плане?
Проверьте, запущена ли функция из службы
Ответ 1
Используйте метод ниже с вашим именем пакета. Он вернется, если какая-либо из ваших действий находится на переднем плане.
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" />
Ответ 2
Используйте 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
в любом случае, надеюсь, что кто-то поможет
Ответ 3
Начиная с 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 в этих действиях или создайте базовую активность для этих действий.
Ответ 4
Есть один недостаток большинства ответов выше, если у вашей активности есть функция, которая запускает другое действие поверх, например. отправка по электронной почте
topActivity
не вернет имя вашего пакета, а вместо него - название пакета селектора активности.
Таким образом, лучше проверить 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;
}
Ответ 5
Я думаю, вы можете получить 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;
}
Ответ 6
Эриан имеет правильный ответ, но его использование "getDefaultSharedPreferences" небезопасно. Когда вы запускаете Сервис, он использует другой экземпляр - Активность. Любые изменения настроек в активности не обновляют общие настройки по умолчанию в Сервисе. Поэтому я изменю код Erian с помощью ".getSharedPreferences" следующим образом:
В действии:
@Override
public void onPause() {
super.onPause();
getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();;
}
@Override
public void onDestroy() {
super.onDestroy();
getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();
}
@Override
public void onResume() {
super.onResume();
getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).edit().putBoolean("isActive", false).commit();
}
В службе:
if (getApplicationContext().getSharedPreferences("preferences", MODE_MULTI_PROCESS).getBoolean("isActive", false)) {
return;
}
Ответ 7
Используйте метод ниже, чтобы получить полное имя класса (имя пакета + класса) текущей активности и проверить, равно ли оно полному имени класса (пакет + имя класса) требуемой активности:
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;
}