2016-02-24 4 views
1

Я ищу, как узнать, находится ли мое приложение на переднем плане или на заднем плане. Я видел два возможных решения, но я не уверен, какой из них лучше (если есть лучший).Лучший способ проверить, находится ли приложение на переднем плане

Решение 1: На моем классе приложения создать два счетчика:

private int mResumedActivities = 0; 
private int mPausedActivities = 0; 

и увеличивает каждый счетчик на каждом onResume/OnPause, так что я мог бы проверить, если приложение находится в фоновом режиме, как:

public boolean isInBackground() { 
    return mPausedActivities >= mResumedActivities; 
} 

Решение 2: Создайте два булева элемента в моем классе приложения: private boolean isAppResumed = false; private boolean isAppInForeground = false;

и на каждом onResume/OnPause обновить isAppResumed и на каждом onResume установить isAppInForeground и на каждом onPaused вызвать обработчик с задержкой так, если через несколько миллисекунд, приложение по-прежнему приостановленным, а затем обновить isAppInForeground к истинным ,

Я думаю, что первое решение проще, но мне не нравится иметь два счетчика, которые могут быть навсегда увеличены. Кроме того, сначала будет вызываться onPause, а затем onResume, поэтому будет несколько миллисекунд, что приложение может подумать, что это на переднем плане, когда на самом деле нет. Как вы думаете?

Спасибо заранее!

+0

Итак, где именно вам нужно это значение? Обычно, как нормальный разработчик делает это, в зависимости от того, какая активность/фрагмент он хочет знать, находится ли приложение на переднем плане, он вводит новую переменную фрагмента/активности, называемую isAcitivtyForeground или isFragmentForeground, и устанавливает ее значение false в onPause и true в onResume – Bhargav

+1

Возможный дубликат [проверить приложение Android на переднем плане или нет?] (http://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground- or-not) – Strider

+0

Я хочу проверить его из другой службы или singleton, полностью независимый от фрагмента/активности. – FVod

ответ

1

Сделайте все, что ваш активизм расширяет BaseActivity, вы можете проверить, находится ли приложение на переднем плане или в фоновом режиме с помощью BaseActivity.isForeground().

public abstract class BaseActivity extends AppCompatActivity { 

    public static final String TAG = BaseActivity.class.getSimpleName(); 
    private static boolean FOREGROUND = false; 
    private static boolean FROM_BACKGROUND = true; 

    public static boolean isForeground() { 
     return !FROM_BACKGROUND; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     FOREGROUND = true; 
     if (FROM_BACKGROUND) { 
      Log.v(TAG, "from background"); 
      FROM_BACKGROUND = false; 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     FOREGROUND = false; 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     FROM_BACKGROUND = !FOREGROUND; 
    } 
} 
Смежные вопросы