J’ai besoin de vérifier si mon récepteur enregistré est toujours enregistrée, sinon comment vérifier toutes les méthodes ?
Réponses
Trop de publicités?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 unBroadcastReceiver
mise en œuvre qui appelleContext#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 plusieursIntentFilters
, la création potentielle d'unIllegalArgumentException
être levée à partir deContext#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.
Vous disposez de plusieurs options
-
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é.
-
Créez une classe qui étend le récepteur et là, vous pouvez utiliser :
-
Pattern singleton pour avoir uniquement une seule instance de cette classe dans votre projet.
-
Mettre en œuvre que les méthodes pour savent si le récepteur est enregistrer.
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();
}
}
.........
}
}