【问题标题】:How to know in BroadcastReceiver if App is running on foreground?如何在 BroadcastReceiver 中知道 App 是否在前台运行?
【发布时间】:2014-06-27 00:41:45
【问题描述】:

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

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

谁能告诉我是哪个问题?我做错了什么?

非常感谢!

【问题讨论】:

  • 再详细说明一下“在前台运行”是什么意思?
  • 你必须显示你的代码请...

标签: android broadcastreceiver foreground


【解决方案1】:

试试这个方法希望对你有用

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" />

【讨论】:

  • 启动应用程序->按home键然后检查
  • android.permission.GET_TASKS 现已弃用。
  • 以及 getRunningTasks 现在已弃用...请更新答案。
【解决方案2】:

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

如果您的意思是屏幕上当前显示了一个Activity,那么最简单的方法是创建一个基本Activity 类,在您的“应用程序”类中设置一个全局布尔值。

自定义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 更加简单(我总是赞成尝试使接收者的逻辑尽可能少)。


这种方法的优点是使用简单,易于理解,不需要额外的权限。

【讨论】:

  • 感谢您的快速回答。就像我在我的问题中解释的那样,我照你说的做,但是这个参数总是错误的,而 Activity 正在运行。这就是问题。而且,你是对的,我没有在 BroadcastReceiver 中进行同步。
  • @PereGarriga 告诉更多关于“在前台运行”的意思?
  • @PereGarriga 我唯一能想到的就是将BroadcastReceiver 的结帐移到您的Service 中,看看它是否仍然是false。
【解决方案3】:

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

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

你可以打开 onStop 方法:

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

如果接收器关闭,则不会出现警报,您的代码也不会被执行

【讨论】:

    【解决方案4】:

    该方法会告诉您应用中的任何活动是否在前景中。如果您检查您的MyApplication.IsactivityVisible()方法,从广播接收器中,那么应该正常工作。如果它返回错误,那么Maybes没有活动 显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2013-11-18
      • 1970-01-01
      • 2013-09-19
      相关资源
      最近更新 更多