studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android broadcastreceiver

android - programacion - Cómo anular el registro de BroadcastReceiver



manual de programacion android pdf (3)

Primero quite la etiqueta del receptor del manifiesto, luego: para el servicio:

@Override public void onCreate() { myReceiver = new SmsBR(); IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.SMS_RECEIVED");// add any actions you want registerReceiver(myReceiver , filter); } @Override public void onDestroy() { super.onDestroy(); if (myReceiver != null) unregisterReceiver(myReceiver); }

para la actividad:

public class MyActivity extends Activity { private final BroadcastReceiver mybroadcast = new SmsBR(); public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(mybroadcast, filter); } public void onPause() { super.onPause(); if (mybroadcast!= null) unregisterReceiver(mybroadcast); } }

Mi aplicación usa un BroadcastReceiver para obtener sms de esta manera:

SmsBR.java

public class SmsBR extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[])bundle.get("pdus"); final SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); } if (messages.length > 0) //doSomething(); } } } }

Manifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Activity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".SmsBR"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> </intent-filter> </receiver> </application>

De esta forma, SmsBR siempre está encendido. Quiero registrarlo cuando se inicia un servicio ( onCreate() ) y anular el registro cuando se destruye el servicio ( onDestroy() ). ¿Cómo puedo hacer esto?


onDestroy() no se garantiza que se onDestroy() . Cuando se inicia la actividad de Activty, se onPause() a los métodos onPause() y onStop() lugar de onDestroy() .

onDestroy() llama cuando presiona el botón Atrás o llama al método finish() .

Por lo tanto, el receptor de difusión debe estar registrado en onRestart() o onResume() , y anular el registro del receptor en onPause() o onStop() .

Si onDestroy() registro del receptor en el método onDestroy() , podría causar una pérdida de memoria en la aplicación .


Editar:

Para una actividad:

Para registrar su receptor de difusión desde su aplicación, primero, elimine la etiqueta <receiver> de su archivo AndroidManifest.xml. Luego, llame registerReceiver(BroadcastReceiver receiver, IntentFilter filter) en su onResume() . Use unregisterReceiver(BroadcastReceiver receiver) en su onPause() para anular el registro del receptor Broadcast.

Por un servicio:

Retire la etiqueta del receptor del archivo de manifiesto. A continuación, puede registrar su receptor de difusión con el mismo método en onCreate() y anular el registro en onDestroy() .

EDITAR: Código de muestra:

public class MyActivity extends Activity { private final BroadcastReceiver mybroadcast = new SmsBR(); public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(mybroadcast, filter); } public void onPause() { super.onPause(); unregisterReceiver(mybroadcast); } }