我正在寻找如何知道我的应用是在前台还是后台。我已经看到了两个可能的解决方案,但我不确定哪个更好(如果有更好的解决方案)。
解决方案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,因此应用程序可能会认为这是前景,而实际上没有。 你觉得怎么样?
提前谢谢!
答案 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;
}
}