Как проверить приложение на переднем плане от службы?

Мне нужно показать уведомление пользователю только в том случае, если приложение не находится на переднем плане. Вот мой открытый класс MyFirebaseMessagingService extends

FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if(applicationInForeground()) {
            Map<String, String> data = remoteMessage.getData();
            sendNotification(data.get("title"), data.get("detail"));
        }

    }

необходимо реализовать метод applicationInForeground()

Ответ 1

Вы можете контролировать запущенные процессы приложения из системной службы Android. Попробуй это:

private boolean applicationInForeground() {
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> services = activityManager.getRunningAppProcesses();
    boolean isActivityFound = false;

    if (services.get(0).processName
            .equalsIgnoreCase(getPackageName()) && services.get(0).importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        isActivityFound = true;
    }

    return isActivityFound;
}

Удачи.

Ответ 2

В Google I/O 2016 я поговорил, где одна из тем: Firebase определяет, находится ли ваше приложение в на переднем плане. Вы можете использовать ActivityLifecycleCallbacks для этого, увеличивая счетчик для каждого действия в вашем приложении, которое запускается, а затем уменьшает его для каждого действия, которое прекращается, Если счетчик равен > 1, ваше приложение находится на переднем плане. Соответствующую часть разговора можно увидеть на YouTube здесь.

Ответ 3

Вы также можете попробовать использовать компоненты жизненного цикла Android.

public class AppFirebaseMessagingService extends FirebaseMessagingService implements LifecycleObserver {

    private boolean isAppInForeground;

    @Override
    public void onCreate() {
        super.onCreate();

        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        ProcessLifecycleOwner.get().getLifecycle().removeObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onForegroundStart() {
        isAppInForeground = true;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onForegroundStop() {
        isAppInForeground = false;
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if(isAppInForeground) {
            // do foreground stuff on your activities
        } else {
            // send a notification
        }
    }
}