tutorial start sendbroadcast registerreceiver oreo example connectivity_change android broadcastreceiver

start - Anular el registro de Android Broadcast Receiver en onReceive arroja "Receiver no registrado"



start broadcast receiver android (7)

Tengo un BroadcastReceiver para un solo uso.

Lo estoy registrando en una actividad. No puedo poner el unregisterReceiver() en onPause porque tiene que seguir funcionando incluso cuando la actividad está en pausa o destruida.

Quiero que BroadcastReceiver se desregistre cuando se haga, algo como esto:

public class SmsReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // do some code.. context.unregisterReceiver(this) } }

Pero provoca una excepción: Receiver not registered.


¿Ha intentado anular el registro del receptor de un Servicio / Actividad? Tal vez haya algún problema si lo llama desde el receptor para anular el registro.


He encontrado el mismo problema, en realidad, la respuesta correcta es LocalBroadcastManager.getInstance(context).unregisterReceiver(this); pero no context.unregisterReceiver(this)


Probablemente ya lo haya desregistrado en otra parte de su programa, por muy improbable que esto pueda sonar. Tal vez en algún lugar antes de su context.unregisterReceiver , pero en el método onReceive usted invoca una acción, lo que resulta en anular el registro del receptor antes de alcanzar context.unregisterReceiver .

Solo asegúrese de anular el registro del receptor desde el menor número de lugares posible, de preferencia, exactamente uno.


Quizás el problema es que está intentando cancelar el registro del receptor del contexto del receptor , en lugar del contexto donde se registró originalmente.


Sé que esta pregunta ya tiene una respuesta Pero intente este Código

Este código es para BatteryInfo . Y funcionó.

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub int level = intent.getIntExtra("level", 0); Log.i("Battery", String.valueOf(level) + "%"); arg0.unregisterReceiver(mBatInfoReceiver); } }; //Below code is the Code which attaches the reciever put this code in which ever place you want. this.registerReceiver(this.mBatInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED));

Referencia para adjuntar / Tutorial


Simplemente agregue una llamada de método a la Actividad en la que lo registró y, en ese método, cancele el registro del receptor. De esa manera sabes que su trabajo ha sido hecho.

Sin embargo, el receptor no funcionará si la actividad se detiene o se destruye de todos modos. Tendría que declararlo en el manifiesto o, de lo contrario, registrarlo en un servicio de larga duración para que funcione fuera de la vida útil de una actividad. Por lo que sé, no puede anular el registro de un receptor declarado en el manifiesto porque no obtiene la instancia con la que está registrado. Pero el método de llamada al servicio para anular el registro debería funcionar.

Si solo necesita un trabajador para un solo uso, declare un IntentService exportado en el manifiesto con la acción que está transmitiendo. Ese IntentService se iniciará cuando se reciba la intención y se le dará la intención que lo inició, y luego, cuando haya terminado su trabajo, se detendrá por sí solo.


Un BroadcastReceiver solo existe durante la ejecución de su método onReceive() . Por lo tanto, esto se evalúa como una instancia desechable cada vez que se enciende / recibe la transmisión. Ver el ciclo de vida del receptor de transmisión . Para registrar / anular el registro de BroadcastReceiver s, debe recordar la instancia de su receptor en onPause() para volver a registrarlo durante onResume() .