Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo saber en BroadcastReceiver si la aplicación se está ejecutando en primer plano?

Estoy trabajando en la aplicación que necesita hacer una sincronización cada noche. Yo uso Alarm Manager que llama a BroadcastReceiver a la hora que quiero. El problema es que no puedo hacer una sincronización si la aplicación se está ejecutando en primer plano para evitar la pérdida de datos. Así que necesito saber en Broadcast Receiver si la aplicación se está ejecutando en primer plano para cancelar esta sincronización.

He probado las soluciones que encontré en StackOverflow: Comprobar si una aplicación de Android se está ejecutando en segundo plano Pero este parámetro es siempre falso en BroadcastReceiver, pero es cierto en las actividades.

¿Puede alguien decirme cuál es el problema? ¿Qué estoy haciendo mal?

¡Realmente gracias!

4 Solutions collect form web for “¿Cómo saber en BroadcastReceiver si la aplicación se está ejecutando en primer plano?”

Prueba de esta manera espero que esto funcione para ti

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; } } 

Agregar este permiso

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

¿Qué quiere decir con "la aplicación se está ejecutando en primer plano"?

Si quiere decir que actualmente hay una Activity en la pantalla, la forma más fácil sería crear una clase de Activity base que establezca un booleano global en su clase `Application '.

Clase de Application personalizada:

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

Clase de Activity personalizada:

 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; } } 

Supongo que no está sincronizando desde su BroadcastReceiver – en su lugar debería estar lanzando un Service para hacer la sincronización. De lo contrario, el sistema podría destruir su aplicación; no debe realizar tareas de larga duración en un BroadcastReceiver .

Así que antes de iniciar el servicio de sincronización, compruebe la aplicación booleana para ver si su aplicación está "en primer plano". Alternativamente, mueva la comprobación dentro del servicio de sincronización, lo que tiene la ventaja de hacer que BroadcastReceiver aún más sencillo (siempre estoy a favor de tratar de hacer que los receptores tengan la menor lógica posible).


Este método tiene las ventajas de que es simple de usar, entender y no requiere permisos adicionales.

Ese método le indica si alguna de sus actividades en su aplicación está actualmente en primer plano. Si comprueba el método MyApplication.isActivityVisible () desde el receptor de difusión, entonces debería funcionar correctamente. Si su devolución es falsa, entonces no se muestran actividades.

En caso de que no quiera hacer nada si la aplicación en primer plano simplemente podría apagar el receptor en su método onStart actividad:

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

Y puede activarlo en el método onStop:

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

Y si el receptor está apagado, no llegará ninguna alarma, y ​​su código no se ejecutará

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.