如何最好地检查Android应用程序是否在前台?

3
我有一个应用程序,使用AsyncTasks向服务器发出REST调用。每当AsyncTask完成时,它会:显示错误对话框/调用下一个活动(如果应用程序在前台)或不执行任何操作(应用程序在后台)。
我这样做是为了避免在将应用程序发送到后台后弹出活动。
我看到了一些实现:
  1. 检查Android应用程序是否在前台?
  2. 从后台任务或服务确定当前前台应用程序
目前我正在使用另一个,甚至更简单的方法:
  • 在每个活动的onResume中,我将全局变量设置为FOREGROUND
  • 在每个活动的onPause中,我将全局变量设置为BACKGROUND
你推荐哪种方法?

PS:我意识到REST调用的最佳实践如此视频https://www.youtube.com/watch?v=xHXn3Kg2IQE&list=PL73AA672847DC7B35所述,而在我特定的情况下,这种方法似乎更为合适。

2个回答

7
private boolean isAppForground() {

        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> l = mActivityManager
                .getRunningAppProcesses();
        Iterator<RunningAppProcessInfo> i = l.iterator();
        while (i.hasNext()) {
            RunningAppProcessInfo info = i.next();

            if (info.uid == getApplicationInfo().uid && info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
                {
                    return true;
               }
           }
        return false;
    }

即使您的应用程序在内存中打开,它也会返回true。 - Nativ

2

我最终使用了一个静态变量,在onResume时每个Activity将其设置为true,在onPause时将其设置为false。

在所有其他activities扩展的Activity上添加了以下方法:

    public abstract class AbstractActivity extends Activity 
    {

     private static boolean isInForeground = false;

     @Override
      protected void onResume()
     {
        super.onResume();
        isInForeground = true;
    }


    @Override
    protected void onPause()
    {
        super.onPause();
        isInForeground  = false;
    }

 }

要理解为什么它有效Activity并排生命周期

这将为我提供信息,以确定我的应用程序是在前台还是后台。

但仍然Shailendra Rajawat是更标准的选项……因为这有一些弱点:

  1. 它仅适用于知道自己的应用程序是否在前台或后台
  2. 如果您有透明活动,它不起作用。由于生命周期不同,当启动透明活动时,onPause/onStop不会被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接