检查应用程序是否在前台的最佳方法

时间:2016-02-24 11:16:43

标签: android performance android-lifecycle

我正在寻找如何知道我的应用是在前台还是后台。我已经看到了两个可能的解决方案,但我不确定哪个更好(如果有更好的解决方案)。

解决方案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更新为true。

我认为第一种解决方案更简单,但我不喜欢有两个可能会永久增加的计数器。此外,onPause将首先被调用,然后是onResume,因此应用程序可能会认为这是前景,而实际上没有。 你觉得怎么样?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

让你的所有活动扩展BaseActivity,你可以使用BaseActivity.isForeground()检查app是在前景还是后台。

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