Cum pentru a verifica dacă Receptorul este înregistrat în Android?

Am nevoie pentru a verifica dacă înregistrați receptorul este încă înregistrat, dacă nu cum pot verifica orice metode?

Comentarii la întrebare (1)

Nu există nici o funcție API pentru a verifica dacă un receptor este înregistrat. Soluție este de a pune codul în încerce bloc catch cum face de mai jos.

try {

 //Register or UnRegister your broadcast receiver here

} catch(IllegalArgumentException e) {

    e.printStackTrace();
}
Comentarii (9)
Soluția

Nu sunt sigur API oferă în mod direct un API, dacă luăm în considerare acest thread]1:

mă întrebam același lucru. În cazul meu, am un BroadcastReceiver de implementare care solicită Context#unregisterReceiver(BroadcastReceiver)trece pe sine ca argument după manipularea Intenția pe care le primește. Există o mică șansă ca receptorul'sonReceive(Context, Intenție) metoda se numește mai mult decât o dată, deoarece este înregistrat cu mai multe IntentFilters, creând potențialul pentru oIllegalArgumentExceptiona fost aruncat din Context#unregisterReceiver(BroadcastReceiver).

În cazul meu, pot stoca un privat sincronizate membru pentru a verifica înainte de a suna `Context#unregisterReceiver(BroadcastReceiver), dar ar fi mult mai curat dacă API-ul oferit un cec metodă.

Comentarii (0)

mai simplă soluție

în receptor:

public class MyReceiver extends BroadcastReceiver {   
    public boolean isRegistered;

    /**
    * register receiver
    * @param context - Context
    * @param filter - Intent Filter
    * @return see Context.registerReceiver(BroadcastReceiver,IntentFilter)
    */
    public Intent register(Context context, IntentFilter filter) {
        try {
              // ceph3us note:
              // here I propose to create 
              // a isRegistered(Contex) method 
              // as you can register receiver on different context  
              // so you need to match against the same one :) 
              // example  by storing a list of weak references  
              // see LoadedApk.class - receiver dispatcher 
              // its and ArrayMap there for example 
              return !isRegistered 
                     ? context.registerReceiver(this, filter) 
                     : null;
            } finally {
               isRegistered = true;
            }
    }

    /**
     * unregister received
     * @param context - context
     * @return true if was registered else false
     */
     public boolean unregister(Context context) {
         // additional work match on context before unregister
         // eg store weak ref in register then compare in unregister 
         // if match same instance
         return isRegistered 
                    && unregisterInternal(context);
     }

     private boolean unregisterInternal(Context context) {
         context.unregisterReceiver(this); 
         isRegistered = false;
         return true;
     }

    // rest implementation  here 
    // or make this an abstract class as template :)
    ...
}

în cod:

MyReceiver myReceiver = new MyReceiver();
myReceiver.register(Context, IntentFilter); // register 
myReceiver.unregister(Context); // unregister 

ad 1

  • în răspundeți la:

Acest e't că elegante pentru că trebuie să vă amintiți să setați e inregistrata pavilion după ce vă înregistrați. – Stealth Rabin

-- "mai litorala mod" adăugat metodă în receptor să se înregistreze și să setați pavilion

va't de lucru Dacă reporniți dispozitivul sau dacă aplicația a fost ucis de sistem de OPERARE. – amin, acum 6 ore

@amin - vezi durată de viață de la cod (nu sistem înregistrată de către manifesta intrare) a înregistrat receptor :)

Comentarii (6)

Eu sunt, folosind această soluție

public class ReceiverManager {

    private static List receivers = new ArrayList();  
    private static ReceiverManager ref;
    private Context context;

    private ReceiverManager(Context context){
        this.context = context;
    }

    public static synchronized ReceiverManager init(Context context) {      
        if (ref == null) ref = new ReceiverManager(context);
        return ref;
    }

    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter){
        receivers.add(receiver);
        Intent intent = context.registerReceiver(receiver, intentFilter);
        Log.i(getClass().getSimpleName(), "registered receiver: "+receiver+"  with filter: "+intentFilter);
        Log.i(getClass().getSimpleName(), "receiver Intent: "+intent);
        return intent;
    }

    public boolean isReceiverRegistered(BroadcastReceiver receiver){
        boolean registered = receivers.contains(receiver);
        Log.i(getClass().getSimpleName(), "is receiver "+receiver+" registered? "+registered);
        return registered;
    }

    public void unregisterReceiver(BroadcastReceiver receiver){
        if (isReceiverRegistered(receiver)){
            receivers.remove(receiver);
            context.unregisterReceiver(receiver);
            Log.i(getClass().getSimpleName(), "unregistered receiver: "+receiver);
        }
    }
}
Comentarii (9)

Aveți mai multe opțiuni

  1. Puteți pune un steag în clasa ta sau de activitate. Pune o variabilă booleană în clasa ta si uita-te la acest steag să știu dacă aveți un Receptor înregistrat.

  2. A crea o clasă care extinde Receptor și nu puteți folosi:

  3. Singleton model pentru doar o instanță a acestei clase în proiectul dumneavoastră.

  4. Pună în aplicare metode de a ști dacă Receptorul este registru.

Comentarii (3)

Trebuie să utilizați try/catch:

try {
    if (receiver!=null) {
        Activity.this.unregisterReceiver(receiver);
    }
} catch (IllegalArgumentException e) {
    e.printStackTrace();
}
Comentarii (0)

O poti face usor....

  1. a crea o variabilă booleană ...
private boolean bolBroacastRegistred;
  1. atunci Când vă înregistrați Receptor de Difuzare, acesta este setat la ADEVĂRAT
...
bolBroacastRegistred = true;
this.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
....
  1. În onPause() o fac...
if (bolBroacastRegistred) {
    this.unregisterReceiver(mReceiver);
    bolBroacastRegistred = false
}

Doar că, și acum, tu nu va primi mai mult mesaj de eroare de excepție pe onPause().

Tip1: folosiți Întotdeauna unregisterReceiver() în onPause() nu în onDestroy() Tip2: Nu uitați să setați bolBroadcastRegistred variabilă FALSE atunci când executați unregisterReceive()

Succes!

Comentarii (0)

Dacă ai pus asta pe onDestroy sau onStop metodă. Cred că atunci când activitatea a fost creat din nou MessageReciver fost't creat.

@Override 
public void onDestroy (){
    super.onDestroy();
LocalBroadcastManager.getInstance(context).unregisterReceiver(mMessageReceiver);

}
Comentarii (0)

Am folosit Intenția de a lăsa Receptor de Difuzare știu despre Handler exemplu de Activitate principala de fir și de Mesaj folosit pentru a trece un mesaj Principal de activitate

Eu am folosit un astfel de mecanism pentru a verifica dacă Difuzare Receptorul este deja înregistrat sau nu. Uneori este necesar atunci când vă înregistrați Receptor de Difuzare dinamic și nu vreau să-l facă de două ori sau de a prezenta utilizatorului în cazul Receptor de Difuzare se execută.

Activitate principala:

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

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

Receptor De Difuzare:

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();
        }
    }
    .........

}

}
Comentarii (0)

Eu personal folosesc metoda de asteptare unregisterReceiver și înghițire excepția daca's de aruncat. Sunt de acord acest lucru este urât, dar cea mai bună metodă prevăzută în prezent.

Am'am ridicat-o cerere caracteristică pentru a obține un boolean metodă de a verifica dacă un receptor este înregistrat adăugat la API-ul Android. Vă rugăm să sprijine aici dacă doriți să vedeți adăugat: https://code.google.com/p/android/issues/detail?id=73718

Comentarii (0)

Am înțeles problema ta, m-am confruntat cu aceeași problemă în Cererea mea. Am fost sunat registerReceiver() timp multiple în cadrul aplicației.

O soluție simplă la această problemă este de a apela registerReceiver() în Aplicație Personalizată Clasă. Acest lucru va asigura că dvs. de receptor de Difuzare va fi numit singurul din întreaga Aplicarea ciclului de viață.

public class YourApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();

        //register your Broadcast receiver here
        IntentFilter intentFilter = new IntentFilter("MANUAL_BROADCAST_RECIEVER");
        registerReceiver(new BroadcastReciever(), intentFilter);

    }
}
Comentarii (0)

Acest lucru este cum am făcut-o, este o versiune modificată a răspuns dat de ceph3us și editat de slinden77 (printre alte lucruri am scos returna valori de metode de care nu am nevoie):

public class MyBroadcastReceiver extends BroadcastReceiver{
    private boolean isRegistered; 

    public void register(final Context context) {
        if (!isRegistered){
            Log.d(this.toString(), " going to register this broadcast receiver");
            context.registerReceiver(this, new IntentFilter("MY_ACTION"));
            isRegistered = true;
        }
    }
    public void unregister(final Context context) {
        if (isRegistered) {            
            Log.d(this.toString(), " going to unregister this broadcast receiver");
            context.unregisterReceiver(this);
            isRegistered = false;
        }
    }
    @Override
    public void onReceive(final Context context, final Intent intent) {        
        switch (getResultCode()){
        //DO STUFF
        }        
    }        
}

Apoi, într-o Activitate clasa:

public class MyFragmentActivity extends SingleFragmentActivity{
    MyBroadcastReceiver myBroadcastReceiver;

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

    @Override
    protected Fragment createFragment(){
        return new MyFragment();
    }

    //This method is called by the fragment which is started by this activity, 
    //when the Fragment is done, we also register the receiver here (if required)
    @Override
    public void receiveDataFromFragment(MyData data) {
        registerBroacastReceiver();
        //Do some stuff                
    }

    @Override
    protected void onStop(){        
        unregisterBroacastReceiver();
        super.onStop();
    }

    void registerBroacastReceiver(){
        if (myBroadcastReceiver == null)
            myBroadcastReceiver = new MyBroadcastReceiver();
        myBroadcastReceiver.register(this.getApplicationContext());
    }

    void unregisterReceiver(){
        if (MyBroadcastReceiver != null)
            myBroadcastReceiver.unregister(this.getApplicationContext());
    }
}
Comentarii (0)

am pus acest cod în activitatea părinte

Listă registeredReceivers = new ArrayList<>();

@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
    registeredReceivers.add(System.identityHashCode(receiver));
    return super.registerReceiver(receiver, filter);
}

@Override
public void unregisterReceiver(BroadcastReceiver receiver) {
    if(registeredReceivers.contains(System.identityHashCode(receiver)))
    super.unregisterReceiver(receiver);
}
Comentarii (0)

Puteți utiliza Pumnalul pentru a crea o referință de acest receptor.

Prima oferi:

@Provides
@YourScope
fun providesReceiver(): NotificationReceiver{
    return NotificationReceiver()
}

Apoi injectați în cazul în care aveți nevoie (folosind constructorul sau câmpul de injecție`)

și pur și simplu trece la registerReceiver.

De asemenea, pune-l în try/catch bloc prea.

Comentarii (0)

Aici's ceea ce am făcut pentru a verifica dacă Radiodifuzorul este deja înregistrată, chiar dacă închideți aplicația (sosire())

Firstime rulează aplicația, trimite un broadcast primul se va returna true/false depinde dacă radiodifuzorul în continuare de funcționare sau nu.

Meu De Radiodifuziune

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getExtras() != null && intent.getStringExtra("test") != null){
            Log.d("onReceive","test");
            return;
        }
    }
}

Mi MainActivity

// init Broadcaster
private NotificationReceiver nr = new NotificationReceiver();

Intent msgrcv = new Intent("Msg");
msgrcv.putExtra("test", "testing");
boolean isRegistered = LocalBroadcastManager.getInstance(this).sendBroadcast(msgrcv);

if(!isRegistered){
    Toast.makeText(this,"Starting Notification Receiver...",Toast.LENGTH_LONG).show();
    LocalBroadcastManager.getInstance(this).registerReceiver(nr,new IntentFilter("Msg"));
}
Comentarii (0)
if( receiver.isOrderedBroadcast() ){
     // receiver object is registered
}
else{
     // receiver object is not registered
}
Comentarii (1)

Doar verifica NullPointerException. Dacă receptorul nu există, atunci...

try{
    Intent i = new Intent();
    i.setAction("ir.sss.smsREC");
    context.sendBroadcast(i);
    Log.i("...","broadcast sent");
}
catch (NullPointerException e)
{
    e.getMessage();
}
Comentarii (3)