Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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

enter image description here

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;
 }