如何在BroadcastReceiver中知道App是否在前台运行?

pga*_*iga 13 android foreground broadcastreceiver

我正在申请,每晚需要进行同步.我使用Alarm Manager在我想要的时刻调用BroadcastReceiver.问题是如果应用程序在前台运行以避免丢失数据,我就无法进行同步.所以我需要在广播接收器中知道应用程序是否在前台运行以取消此同步.

我尝试了在StackOverflow中找到的解决方案: 检查Android应用程序是否在后台运行 但是此参数在BroadcastReceiver中始终为false,但在activites中为true.

谁能告诉我哪个是问题?我做得不好?

真的感谢!

Bir*_*dia 13

试试这种方式希望这适合你

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (isAppForground(context)) {
            // App is in Foreground
        } else {
            // App is in Background
        }
    }

    public boolean isAppForground(Context mContext) {

        ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(mContext.getPackageName())) {
                return false;
            }
        }

        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

添加此权限

<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)

  • android.permission.GET_TASKS现在已被弃用。 (2认同)
  • &lt;uses-permission android:name="android.permission.GET_TASKS" /&gt; 和 getRunningTasks 现在已弃用...请更新答案。 (2认同)