2016-02-24 84 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的新片段/活動變量,並在onPause中將其設置爲false,並在onResume中將其設置爲false – Bhargav

+1

[檢查Android應用程序是否在前景?](http://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not) – Strider

+0

我想檢查從另一個服務或單身,完全獨立於片段/活動。 – FVod

回答

1

使所有您的activitis擴展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; 
    } 
} 
相關問題