290 votes

Comment faire pour vérifier si le récepteur est enregistré dans android

J’ai besoin de vérifier si mon récepteur enregistré est toujours enregistrée, sinon comment vérifier toutes les méthodes ?

359voto

Daniel Velkov Points 9244

Il n’y a pas de fonction API pour vérifier si un récepteur est enregistré. La solution consiste à placer votre code dans un `` bloc.

76voto

VonC Points 414372

Je ne suis pas sûr de l'API fournit directement une API, si vous pensez à ce fil:

Je me demandais la même chose.
Dans mon cas, j'ai un BroadcastReceiver mise en œuvre qui appelle Context#unregisterReceiver(BroadcastReceiver) passant comme l'arg après manipulation de l'Intention qu'il reçoit.
Il ya une petite chance que le récepteur de l' onReceive(Context, Intent) méthode est appelée plus d'une fois, depuis qu'il est enregistré auprès de plusieurs IntentFilters, la création potentielle d'un IllegalArgumentException être levée à partir de Context#unregisterReceiver(BroadcastReceiver).

Dans mon cas, je peux stocker un privé synchronisé membre à vérifier avant d'appeler Context#unregisterReceiver(BroadcastReceiver), mais il serait beaucoup plus propre si l'API fournit une méthode de contrôle.

30voto

dmmh Points 1124

J’utilise cette solution

23voto

chemalarrea Points 807

Vous disposez de plusieurs options

  1. Vous pouvez placer un drapeau dans votre classe ou votre activité. Mettre une variable booléenne dans votre classe et regarder cet indicateur pour savoir si vous avez le récepteur enregistré.

  2. Créez une classe qui étend le récepteur et là, vous pouvez utiliser :

  3. Pattern singleton pour avoir uniquement une seule instance de cette classe dans votre projet.

  4. Mettre en œuvre que les méthodes pour savent si le récepteur est enregistrer.

3voto

jarek Points 21

J'ai utilisé l'Intention de laisser Récepteur de Radiodiffusion connaître instance de Gestionnaire de l'Activité principale de thread et de Message utilisé pour transmettre un message à l'activité Principale

J'ai utilisé ce mécanisme pour vérifier si le Récepteur de Radiodiffusion est déjà inscrit ou pas. Il est parfois nécessaire lorsque vous enregistrez votre Récepteur de Radiodiffusion de façon dynamique et ne veulent pas faire deux fois ou de vous présenter à l'utilisateur si le Récepteur de Radiodiffusion est en cours d'exécution.

Activité principale:

public class Example extends Activity {

private BroadCastReceiver_example br_exemple;

final Messenger mMessenger = new Messenger(new IncomingHandler());

private boolean running = false;

static class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        running = false;    
        switch (msg.what) {
        case BroadCastReceiver_example.ALIVE:
    running = true;
            ....
            break;
        default:

            super.handleMessage(msg);
        }

    }
    }

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter();
        filter.addAction("pl.example.CHECK_RECEIVER");

        br_exemple = new BroadCastReceiver_example();
        getApplicationContext().registerReceiver(br_exemple , filter); //register the Receiver
    }

// call it whenever you want to check if Broadcast Receiver is running.

private void check_broadcastRunning() {    
        /**
        * checkBroadcastHandler - the handler will start runnable which will check if Broadcast Receiver is running
        */
        Handler checkBroadcastHandler = null;

        /**
        * checkBroadcastRunnable - the runnable which will check if Broadcast Receiver is running
        */
        Runnable checkBroadcastRunnable = null;

        Intent checkBroadCastState = new Intent();
        checkBroadCastState .setAction("pl.example.CHECK_RECEIVER");
        checkBroadCastState .putExtra("mainView", mMessenger);
        this.sendBroadcast(checkBroadCastState );
        Log.d(TAG,"check if broadcast is running");

        checkBroadcastHandler = new Handler();
        checkBroadcastRunnable = new Runnable(){    

            public void run(){
                if (running == true) {
                    Log.d(TAG,"broadcast is running");
                }
                else {
                    Log.d(TAG,"broadcast is not running");
                }
            }
        };
        checkBroadcastHandler.postDelayed(checkBroadcastRunnable,100);
        return;
    }

.............
}

Récepteur De Radiodiffusion:

public class BroadCastReceiver_example extends BroadcastReceiver {


public static final int ALIVE = 1;
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Bundle extras = intent.getExtras();
    String action = intent.getAction();
    if (action.equals("pl.example.CHECK_RECEIVER")) {
        Log.d(TAG, "Received broadcast live checker");
        Messenger mainAppMessanger = (Messenger) extras.get("mainView");
        try {
            mainAppMessanger.send(Message.obtain(null, ALIVE));
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    .........

}

}

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