检查我的应用是否在后台运行

时间:2017-04-13 21:39:02

标签: android

这个问题已被问过一百次,但我可以使用

得到相同的答案
getRunningAppProcesses()

在Lollipop上无法正常工作

所以有一个完全可靠的方法来了解我的应用程序是否在后台运行?

谢谢

修改

这是我用来检查前景中的应用程序:

使用的偏好:

    public static void setStartingActivity(Context context, boolean isStartingActivity) {
        PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("isStartingActivity", isStartingActivity).apply();
    }

    public static boolean isStartingActivity(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("isStartingActivity", false);
    }

    public static void setAppRunningInForeground(Context context, boolean isRunning) {
        PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("AppIsRunningInForeground", isRunning).apply();
    }

    public static boolean isAppRunningForeground(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("AppIsRunningInForeground", false);
    }

开始活动:

Utility.PreferencesManager.setStartingActivity(getApplicationContext(), true);
startActivity(new Intent(getApplicationContext(), MainActivity.class));

onStop和onStart实现:

@Override
protected void onStart() {
    super.onStart();
    Log.e("Debugging", "MainActivity onStart");
    Utility.PreferencesManager.setAppRunningInForeground(getApplicationContext(), true);
}

@Override
protected void onStop() {
    super.onStop();
    Log.e("Debugging", "MainActivity onStop");

    if (!Utility.PreferencesManager.isStartingActivity(getApplicationContext()))
        Utility.PreferencesManager.setAppRunningInForeground(getApplicationContext(), false);
    else
        Utility.PreferencesManager.setStartingActivity(getApplicationContext(), false);
}

1 个答案:

答案 0 :(得分:0)

当用户界面处于暂停状态时阻止同步无法解决您的问题,原因很简单,因为用户可能会在同步过程中返回您的用户界面。你需要能够处理这种情况。

当用户最近进入您的用户界面时,避免同步,对于“最近”的短暂值,可能有助于降低用户在应用同步时返回用户界面的几率。

根据您的评论,我们假设您的应用包含1个以上的活动以及您的同步适配器。运行同步适配器时,您需要确定用户最近是否已进入此过程的UI。

有三种可能性:

  1. 当同步适配器运行时,UI位于前台

  2. 同步适配器运行时,UI处于后台

  3. 没有用户界面,因为您的用户界面终止的最后一个进程,以及您的同步适配器在没有UI位的新进程中运行

  4. 关闭袖口,要处理,我会有一个自定义Application,有两个boolean字段:

    • areActivitiesCreated,如果此流程创建了一项活动true,则默认为false

    • isInBackground,如果应用在后台,则为true,否则为false

    我会拥有Application call registerActivityLifecycleCallbacks(),并在回调的areActivitiesCreated中将true设置为onActivityCreated

    我会Application覆盖onTrimMemory(),并根据传入的修剪级别更新isInBackground,如果修剪级别是其中之一,则将其设置为false TRIM_MEMORY_RUNNING_*值,或true

    然后,如果areActivitiesCreatedfalse(意味着您没有用户界面)或isInBackgroundtrue,则您的同步适配器会继续工作意思是你不在前台。)

    这样就无需为所有活动添加代码来跟踪这种情况。