2017-04-13 61 views
0

这个问题已经被问喜欢百倍运行,但所有我能罚有使用检查,如果我的应用程序在后台

getRunningAppProcesses() 

相同的答案不上棒棒堂

正常工作所以它有一个完全可靠的方法来知道我的应用程序是否在背景中活着?

谢谢

编辑:

这就是我用它来检查,如果在前台应用程序:使用

喜好:

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

您是否尝试过[onPause](https://developer.android.com/guide/components/activities/activity-lifecycle.html#onpause) – Derek

+0

我认为这是寻找的内容:http:// stackoverflow。 com/questions/30619349/android-5-1-1-and-above-getrunningappprocesses-returns-my-application-packag –

+0

通常,无论您在此尝试完成什么,都有更好的解决方案。你打算如何处理关于你是处于前景还是背景的信息? – CommonsWare

回答

0

阻止同步时,UI围绕不会解决你的问题,仅仅是因为用户可以返回到你的用户界面,而你是在一个同步的中间。你需要能够处理这种情况。

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

根据您的意见,我们假设您的应用包含1+个活动加上您的同步适配器。当您的同步适配器运行时,您需要确定用户最近是否已经进入用户界面进行此过程。

有三种可能性:

  1. 的UI是在前台当同步适配器运行

  2. 的UI是在后台运行同步适配器运行

  3. 有没有用户界面,因为您的用户界面已被终止的最后一个进程,并且您的同步适配器在没有用户界面的新进程中运行

即兴,来处理,我将有一个自定义Application,有两个boolean领域:

  • areActivitiesCreated,这将是true如果这个过程在默认情况下

  • 曾经创建活动, false
  • isInBackground

    ,这将是true,如果应用程序是在后台运行,否则false

我会有Applicationcall registerActivityLifecycleCallbacks(),并设置areActivitiesCreatedtrue在回调的onActivityCreated

我将有Application覆盖onTrimMemory(),并更新基于传入的内饰水平isInBackground,将其设置为false如果修剪水平是TRIM_MEMORY_RUNNING_*值之一,或true否则。

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

这样可以避免将代码添加到所有活动以跟踪此情况。

相关问题