3 votes

Comment vérifier si une application s'exécute en arrière-plan ou au premier plan dans un BroadcastReceiver

Je veux vérifier si mon application est en arrière-plan ou en premier plan et je veux également vérifier si l'application est ouverte ou non en utilisant un BroadcastReceiver

public class CheckRunningApplicationReceiver extends BroadcastReceiver {
Context mContext;

public int mId = 1000;
NotificationManager mNotificationManager;

@Override
public void onReceive(Context aContext, Intent anIntent) {
    mContext = aContext;
    Boolean isAppOpen = isApplicationSentToBackground(aContext);
    mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    if (isAppOpen) {
        //openNotification();
    } else {
        //mNotificationManager.cancel(mId);
    }

}

private void openNotification() {// Instantiate notification with icon and
                                    // ticker message
    Notification notification = new Notification(R.drawable.ic_launcher,"Message de notification!", System.currentTimeMillis());
    PendingIntent i = PendingIntent.getActivity(mContext, 0, new Intent(mContext,MainActivity.class), 0);
    notification.setLatestEventInfo(mContext, "Notification créée","Cliquez ici pour voir le message", i);
    notification.flags = Notification.FLAG_ONGOING_EVENT; 
    mNotificationManager.notify(mId, notification);
}

public static boolean isApplicationSentToBackground(final Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List tasks = am.getRunningTasks(1);
    if (!tasks.isEmpty()) {
        ComponentName topActivity = tasks.get(0).topActivity;
        if (!topActivity.getPackageName().equals(context.getPackageName())) {
            return true;
        }
    }

    return false;
}

}

Y a-t-il une solution pour cela, aidez moi, Merci.

0voto

Nowshad Points 279

Un BroadcastReceiver fonctionne même lorsque l'application est en arrière-plan car les événements que le récepteur capte sont envoyés globalement et chaque application est enregistrée pour écouter ceux-ci, que l'application soit en cours d'exécution ou non.

Pour gérer cela, dans le code onReceive de votre BroadcastReceiver, vérifiez si votre application est au premier plan.

Il existe une méthode--et une seule que je connaisse--efficace de manière cohérente pour le faire. Vous devez suivre vos actions de pause/reprise pour votre application. Assurez-vous de vérifier cela dans chaque activité.

Il y a un exemple de code dans cette réponse. Dans votre cas, vous voudriez vérifier que MyApplication.isActivityVisible() == true comme validation avant de faire quoi que ce soit à partir de votre BroadcastReceiver.

-1voto

H4SN Points 620

Dans votre activité, inscrivez le récepteur de diffusion pour vérifier si l'activité est au premier plan ou en arrière-plan.

StackAnswer.java
public class StackAnswer extends Activity {
    public static final int IS_ALIVE = Activity.RESULT_FIRST_USER;
    public static final String CHECK_ALIVE_ACTION = "CHECK_ALIVE_ACTION";
    private BroadcastReceiver mRefreshReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRefreshReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                Log.i("onReceive","BroadcastIntent received in MainActivity");

                // TODO:                
                // Vérifiez que c'est une diffusion ordonnée
                // Informez l'expéditeur que l'intention a été reçue
                // en définissant le code de résultat sur MainActivity.IS_ALIVE
                setResultCode(MainActivity.IS_ALIVE);
            }
        };
    }

    // Enregistrer le BroadcastReceiver
    @Override
    protected void onResume() {
        super.onResume();

        // TODO:
        // Enregistrez le BroadcastReceiver pour recevoir une
        // diffusion de l'action DATA_REFRESHED_ACTION
        IntentFilter filter = new IntentFilter();
        filter.addAction(CHECK_ALIVE_ACTION);         
        registerReceiver(mRefreshReceiver, filter);     

    }

    @Override
    protected void onPause() {

        // TODO:
        // Désinscrivez le BroadcastReceiver s'il a été enregistré
        // Remarque : Pour contourner un problème de Robotium - vérifiez que le BroadcastReceiver
        // n'est pas nul avant d'essayer de le désinscrire
        if(mRefreshReceiver!=null){
            unregisterReceiver(mRefreshReceiver);
        }
        super.onPause();
    }

}

Envoyez une diffusion depuis l'arrière-plan pour vérifier si l'activité est en vie ou non

   BackgroundTask.java
   public class BackgroundTask {

    private void checkIfForeground (Context mApplicationContext){
        mApplicationContext.sendOrderedBroadcast(new Intent(
                StackAnswer.CHECK_ALIVE_ACTION), null,
                new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO: Vérifiez si le code de résultat n'est pas MainActivity.IS_ALIVE
                if (getResultCode() != StackAnswer.IS_ALIVE) {
                    //Arrière-plan
                }else{
                    //Premier plan
                }
            }
        }, null, 0, null, null);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X