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

时间:2014-05-09 10:03:47

标签: android broadcastreceiver foreground

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

我尝试过在StackOverflow中找到的解决方案: Checking if an Android application is running in the background 但是此参数在BroadcastReceiver中始终为false,但在activites中为true。

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

非常感谢!

4 个答案:

答案 0 :(得分: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;
    }

}

添加此权限

<uses-permission android:name="android.permission.GET_TASKS" />

答案 1 :(得分:3)

“应用程序在前台运行”是什么意思?

如果你的意思是屏幕上当前显示Activity,那么最简单的方法是创建一个基类Activity类,在你的`Application'类中设置一个全局布尔值。

自定义Application类:

public class MyApp extends Application
{
    public boolean isInForeground = false;
}

自定义基础Activity类:

abstract public class ABaseActivity extends Activity
{

    @Override
    protected void onResume()
    {
        super.onResume();

        ((MyApp)getApplication()).isInForeground = true;
    }

    @Override
    protected void onPause()
    {
        super.onPause();

        ((MyApp)getApplication()).isInForeground = false;
    }
}

我假设您没有从BroadcastReceiver进行同步 - 您应该启动Service来进行同步。否则系统可能会终止您的应用 - 您不能在BroadcastReceiver中执行任何长时间运行的任务。

因此,在启动同步服务之前,请检查应用程序布尔值以查看您的应用是否处于“前台”状态。或者,将检查移到同步服务中,这样可以使BroadcastReceiver更简单(我总是赞成尽量使接收器具有尽可能少的逻辑)。


此方法的优点是易于使用,易于理解,并且不需要额外的权限。

答案 2 :(得分:0)

该方法会告诉您应用中的任何活动当前是否在前台。如果从广播接收器检查MyApplication.isActivityVisible()方法,则应该可以正常工作。如果它返回false,则maybes没有 显示的活动。

答案 3 :(得分:0)

如果你不想做任何事情,如果应用程序在前台你可以简单地关闭你的活动onStart方法上的接收器:

ComponentName receiver = new ComponentName(context, MyReceiver.class);
context.getPackageManager().setComponentEnabledSetting(receiver,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);

你可以在onStop方法上打开它:

anObject

如果接收器关闭,则不会发出警报,并且不会执行您的代码