Cómo crear BroadcastReceiver sin actividad

Me gustaría crear una aplicación que responda a recibir mensajes SMS y mostrar un diálogo. ¿Cómo puedo registrar el receptor en el manifiesto sin definir dentro de una actividad?

Intenté mantener las etiquetas del receptor / filtro de intención en el manifiesto fuera de la etiqueta de actividad, pero el emulador no instalará el apk ya que no hay actividad de lanzamiento. Mantener BroadcastReceiver como actividad principal produce un error de "Incapaz de instanciar actividad" en Logcat.

¿Alguna ayuda?

Gracias, soleado

Clase del receptor

public class SMSReceiver extends BroadcastReceiver { // onCreat is invoked when an sms message is received. // Message is attached to Intent via Bundle, stored in an Object // array in the PDU format. public void onReceive(Context context, Intent intent) { // get the SMS message passed in from Bundle Bundle bundle = intent.getExtras(); String bodyText = ""; String from = ""; if (bundle != null) { //Retrieve sms message within Object array Object[] pdus = (Object[]) bundle.get("pdus"); SmsMessage[] msgs = new SmsMessage[pdus.length]; for (int i=0; i < msgs.length; i++) msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); for (SmsMessage message: msgs) { bodyText = message.getMessageBody(); from = "Message from " + message.getOriginatingAddress() + ": "; } // Display message in pop up Toast.makeText(context, from + bodyText, Toast.LENGTH_SHORT).show(); } } } 

Manifiesto

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="home.splttingatms.SMSReceiver" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SMSReceiver" 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=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> </manifest> 

Lo que está intentando hacer es incorrecto por lo menos las siguientes razones …

  1. MAIN / LAUNCHER sólo se aplican a las actividades y como usted no tiene una clase que extiende la actividad en su código, esto es lo que está causando el error.
  2. Aunque no hay nada malo con una "aplicación" que implementa sólo un BroadcastReceiver o servicio, es una buena práctica para que el usuario sepa que las cosas se han inicializado correctamente. Incluso si pudiera listar un receptor / servicio en 'Todas las aplicaciones', si lo seleccionan y no ven nada, no van a ser felices, a los usuarios les gusta ver algunos comentarios.

En pocas palabras, crea una actividad simple que aparecerá en 'Todas las aplicaciones' y tiene la configuración de intención PRINCIPAL / LANZADOR y cuando se inicia sólo tiene que crear un diálogo diciendo algo como "Hola, bienvenido a …" o algún otro comentario a El usuario les permite saber que las cosas han comenzado correctamente. Tenga un botón "Aceptar" en el diálogo que cuando se presiona, llama al método finish () de la actividad dejando el receptor en su lugar.

Una forma de ocultar la Activity es utilizando el siguiente tema en el archivo de manifiesto de Android de su aplicación:

 <activity android:name=".SomeActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

NOTA: El uso de esta función hace que su aplicación no aparezca al iniciarse, pero todavía no se deshace del icono del lanzador. Y si eliminas el icono, no podrás iniciar la aplicación. (Figura de su manera alrededor de que uno!)

De la documentación de sendBroadcast () :

No se propagan resultados de los receptores y los receptores no pueden abortar la emisión. Si desea permitir que los receptores propagen resultados o aborten la transmisión, debe enviar una emisión ordenada utilizando sendOrderedBroadcast (Intent, String).

Use sendOrderedBroadCast () en su lugar

  • ¿Cómo puedo enviar sms falsos a mí mismo sin el uso de la red móvil?
  • Registrar BroadcastReceiver para SMS entrantes
  • Leer todos los SMS de un remitente en particular
  • ¿Cómo enviar un SMS usando SMSmanager en Dual SIM móvil?
  • Volver a Actividad después de completar la acción en Android?
  • Android: configurar el tono de notificación de SMS
  • Obtener mensajes SMS desde la tarjeta SIM
  • Caracteres especiales en sms de Android
  • SMS tipo de Android 0
  • Cómo borrar db cuando la aplicación se desinstala en android
  • SMS no recibidos ... sólo en ciertos casos ... Carrier / Country?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.