Как узнать в BroadcastReceiver, если приложение работает на переднем плане?

Я работаю в приложении, которое требует синхронизации каждую ночь. Я использую Alarm Manager, который вызывает BroadcastReceiver в тот час, который я хочу. Проблема в том, что я не могу выполнить синхронизацию, если приложение работает на переднем плане, чтобы избежать потери данных. Поэтому мне нужно знать в Broadcast Receiver, если приложение работает на переднем плане, чтобы отменить эту синхронизацию.

Я пробовал решения, которые я нашел в StackOverflow: проверка, работает ли приложение Android в фоновом режиме. Но этот параметр всегда неверен в BroadcastReceiver, но это верно в действиях.

Может ли кто-нибудь сказать мне, в чем проблема? Что я делаю плохо?

Большое спасибо!

Solutions Collecting From Web of "Как узнать в BroadcastReceiver, если приложение работает на переднем плане?"

Попытайтесь таким образом надеяться, что это сработает для вас

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

Что вы подразумеваете под «приложение работает на переднем плане»?

Если вы имеете в виду, что на экране отображается действие, то самым простым способом было бы создать базовый класс Activity который устанавливает глобальное логическое значение в вашем классе «Application».

Пользовательский класс Application :

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

Пользовательская база Класс действия:

 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 .

Поэтому перед запуском службы синхронизации проверьте приложение boolean, чтобы узнать, находится ли ваше приложение на переднем плане. В качестве альтернативы, переместите проверку внутри службы синхронизации, которая имеет преимущество в том, что сделать BroadcastReceiver еще проще (я всегда в пользу попыток сделать приемники как можно меньше логики).


Этот метод имеет то преимущество, что он прост в использовании, понимании и не требует дополнительных разрешений.

Этот метод сообщает вам, находится ли на вашем переднем плане какая-либо из ваших действий в вашем приложении. Если вы проверите свой метод MyApplication.isActivityVisible () от широковещательного приемника, это должно работать нормально. Если он возвращает false, то maybes не показывает никаких действий.

В случае, если вы не хотите ничего делать, если приложение на переднем плане вы можете просто отключить приемник на вашем методе 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); 

И если приемник выключен, к нему не придет никаких сигналов тревоги, и ваш код не будет выполнен