这个问题已被问过一百次,但我可以使用
得到相同的答案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);
}
答案 0 :(得分:0)
当用户界面处于暂停状态时阻止同步无法解决您的问题,原因很简单,因为用户可能会在同步过程中返回您的用户界面。你需要能够处理这种情况。
当用户最近进入您的用户界面时,避免同步,对于“最近”的短暂值,可能有助于降低用户在应用同步时返回用户界面的几率。
根据您的评论,我们假设您的应用包含1个以上的活动以及您的同步适配器。运行同步适配器时,您需要确定用户最近是否已进入此过程的UI。
有三种可能性:
当同步适配器运行时,UI位于前台
同步适配器运行时,UI处于后台
没有用户界面,因为您的用户界面终止的最后一个进程,以及您的同步适配器在没有UI位的新进程中运行
关闭袖口,要处理,我会有一个自定义Application
,有两个boolean
字段:
areActivitiesCreated
,如果此流程创建了一项活动true
,则默认为false
isInBackground
,如果应用在后台,则为true
,否则为false
我会拥有Application
call registerActivityLifecycleCallbacks()
,并在回调的areActivitiesCreated
中将true
设置为onActivityCreated
。
我会Application
覆盖onTrimMemory()
,并根据传入的修剪级别更新isInBackground
,如果修剪级别是其中之一,则将其设置为false
TRIM_MEMORY_RUNNING_*
值,或true
。
然后,如果areActivitiesCreated
为false
(意味着您没有用户界面)或isInBackground
为true
,则您的同步适配器会继续工作意思是你不在前台。)
这样就无需为所有活动添加代码来跟踪这种情况。