2010-12-16 13 views
24

Tengo un service que se puede iniciar y detener desde un button.registro receptor en un servicio

Pero dentro del service Quiero registrar un receptor para escuchar las transmisiones de SMS. Solo quiero que service escuche por SMS mientras se está ejecutando. Intenté registerReceiver(receiver, intentfilter) pero esto no funciona. ¿Qué estoy haciendo mal?

+0

Esta pregunta será más útil para las personas si especifica el problema. "Esto no funciona" = "El receptor nunca recibe llamadas", por ejemplo? ¿O se llama, pero no con SMS_RECEIVED_ACTION? O hay un error? o ... – LarsH

Respuesta

2

Debe establecer permisos en el archivo AndroidManifest.

<receiver android:name=".MySMSReciever"> 
     <intent-filter> 
      <action android:name= 
       "android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 
+0

Lo he hecho. Aparece un error de AccountManagerService and ContactsProvider/ – Vic

+0

¿Es correcto mi IntentFilter? cadena estática privada final SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"? – Vic

+4

Sí, así es como se agrega el receptor en el manifiesto, pero quiero registrarlo dinámicamente. El método anterior escucha todos los SMS entrantes, incluso cuando mi servicio está detenido. Solo quiero escuchar SMS mientras mi servicio se está ejecutando. – Vic

77

Si sólo desea recibir la emisión, mientras que su servicio se está ejecutando, necesitará registrar dinámicamente su receptor en onCreate()

También es importante que no se olvide de cancelar el registro de su receptor en el OnDestroy() método!

Ejemplo:

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.widget.Toast; 

public class YourClass extends Service { 

    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED"; 
    private BroadcastReceiver yourReceiver; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     final IntentFilter theFilter = new IntentFilter(); 
     theFilter.addAction(ACTION); 
     this.yourReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Do whatever you need it to do when it receives the broadcast 
       // Example show a Toast message... 
       showSuccessfulBroadcast(); 
      } 
     }; 
     // Registers the receiver so that your service will listen for 
     // broadcasts 
     this.registerReceiver(this.yourReceiver, theFilter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // Do not forget to unregister the receiver!!! 
     this.unregisterReceiver(this.yourReceiver); 
    } 

    private void showSuccessfulBroadcast() { 
     Toast.makeText(this, "Broadcast Successful!!!", Toast.LENGTH_LONG) 
       .show(); 
    } 
} 
+1

Gracias DDoSAtack, esto fue bastante fácil y pasé algunas horas buscando esto pero no encontré ninguna solución, pero fue bastante fácil y comprensible. (S) Gracias :) – Zaksh

+0

¿Por qué esta respuesta no es aceptada como una solución? – akmal

+0

Esta respuesta es la correcta. Lo usé para IntentService y también funcionó, y quiero poner énfasis en registrar el receptor en onCreate() específicamente. – Edeph

1

Eliminar la intención de filtro de la xml y hacer sólo el registro dinámico del receptor. Si no desea que funcione cuando el servicio está apagado, anule el registro antes de detener el servicio. No olvide agregar el permiso al archivo xml ...

Cuestiones relacionadas