2010-12-21 19 views
5

Me gustaría crear una aplicación que responda a la recepción de mensajes SMS y mostrar un cuadro de diálogo. ¿Cómo puedo registrar el receptor en el manifiesto sin definir dentro de una actividad?Cómo crear BroadcastReceiver sin 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 inicio. Mantener el BroadcastReceiver como la actividad principal da como resultado un error "No se puede crear una instancia de la actividad" en el Logcat.

¿Algún ayuda?

Gracias, Sunny

clase 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> 
+0

he intentado hacer algo similar, en realidad aún más simple ya que todo lo que quería era hacer era conseguir una notificación en la barra de estado cuando puedo rotar la pantalla. No hay tanta suerte en el emulador. –

+0

Ver mi respuesta en [Crear receptor de difusión sin UI] (http://stackoverflow.com/questions/22318161/start-application-without-activity-my-broadcast-receptor-not-work/33249673#33249673) –

+0

Ver mi respuesta responder a [Crear receptor de difusión sin UI] (http://stackoverflow.com/questions/22318161/start-application-without-activity-my-broadcast-receptor-not-work/33249673#33249673) –

Respuesta

1

Lo que estamos tratando de hacer es incorrecto para al menos las siguientes razones ...

  1. MAIN/LAUNCHER solo se aplican a actividades y como no tiene una clase que amplíe la actividad en su código, esto es lo que está causando el error.
  2. Aunque no hay nada de malo con una 'aplicación' que implementa solo un BroadcastReceiver o servicio, es una buena práctica que el usuario sepa que las cosas se han inicializado correctamente. Incluso si pudiera enumerar un receptor/servicio en 'Todas las aplicaciones', si lo seleccionan y no ven que pasa nada, no estarán contentos; 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 PRINCIPAL/LANZADOR de intención y cuando comienza solo tiene que crear un diálogo que diga algo así como "Hola, bienvenido a ... "o algún otro comentario para el usuario haciéndoles saber que las cosas comenzaron correctamente. Tenga un botón 'Aceptar' en el cuadro de diálogo que cuando se presiona, llama al método de finalización de la actividad() dejando el receptor en su lugar.

+1

Implementé un " realimentación "actividad que alerta al usuario de que el programa está funcionando. Mi otro problema era que una actividad temática de diálogo mostraría la ventana de comentarios por algún motivo, pero llamar al método finish() funcionó. Gracias por tu ayuda. – splttingatms

+0

Me alegra que te haya sido útil, buena suerte con el resto de tu código. – Squonk

2

Una forma de ocultar el Activity es usando el siguiente tema en el Android File Manifiesto de la 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: Usando esto hace que su aplicación no aparece cuando se lanzó, pero aún lo hace no deshacerse del icono del iniciador. Y si elimina el ícono, no podrá iniciar la aplicación. (Figura su camino en que uno!)

+0

Acabo de encontrar esto mientras buscaba el mismo problema y pensé que lo pondría aquí. Espero que ayude a alguien! – shyam

0

de sendBroadcast() documentation:

resultados se propagan desde los receptores y los receptores no pueden abortar la transmisión. Si desea permitir que los receptores propaguen resultados o cancelen la transmisión, debe enviar una transmisión ordenada utilizando sendOrderedBroadcast (Intención, Cadena).

uso sendOrderedBroadCast() lugar

Cuestiones relacionadas