2011-03-13 18 views
45

Estoy supervisando los SMS entrantes.Android BroadcastReceiver al inicio: siga funcionando cuando la actividad esté en el fondo

Mi aplicación está funcionando perfectamente con BroadcastReceiver. Sin embargo, está trabajando desde una actividad y me gustaría mantener el BroadcastReceiver ejecutándose todo el tiempo (y no solo cuando mi actividad se está ejecutando).

¿Cómo puedo lograrlo? He revisado el ciclo de vida del BroadcastReceiver, pero todo lo que se menciona en la documentación es que el ciclo de vida está limitado al método onReceive, no al ciclo de vida de mantener el BroadcastReceiver buscando mensajes SMS entrantes.

¿Cómo puedo hacer esto persistente?

Gracias

Respuesta

132

es necesario definir un receptoren el manifiesto con el nombre de la acción android.intent.action.BOOT_COMPLETED.

<!-- Start the Service if applicable on boot --> 
<receiver android:name="com.prac.test.ServiceStarter"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

Asegúrese de incluir también el permiso de arranque completo.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

Uso Service para que esto se haga nada persisten. Y use los receptores para recibir eventos de arranque para reiniciar el servicio nuevamente si el sistema arranca ...

Código para iniciar el servicio en el arranque. Haga que el Servicio haga su trabajo de verificar sms o lo que quiera. Necesitas hacer tu trabajo en MyPersistingService defínalo tú mismo.

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class ServiceStarter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent i = new Intent("com.prac.test.MyPersistingService"); 
     i.setClass(context, MyPersistingService.class); 
     context.startService(i); 
    } 
} 
+10

Es posible que también desee asegurarse de que tiene el permiso 'RECEIVE_BOOT_COMPLETED' definido en el archivo de manifiesto de su aplicación para que esto funcione. –

+0

¿Funciona esto si el contexto de la aplicación extiende otro de una biblioteca de proyectos? – Maxrunner

+0

Gracias Javanator (Rohit), es su ayuda para mí (Ravi-CIPL y Malasia) – DynamicMind

5

Servicio o de arranque Completado no es obligatorio

De hecho, no es necesario poner en práctica un Service o registro para android.intent.action.BOOT_COMPLETED

Algunos ejemplos se muestra cómo registrar/anular el registro de un BroadcastReceiver cuando la actividad es creada y destruida Sin embargo, esto es útil para las intenciones que espera solo cuando se abre la aplicación (para la comunicación interna entre Servicio/Actividad, por ejemplo).

Sin embargo, en el caso de un SMS, desea escuchar el intento todo el tiempo (y no solo cuando abre la aplicación).

Hay otra manera

Se puede crear un class que se extiende BroadcastReceiver y registrar a las intenciones deseadas a través de AndroidManifest.xml. De esta manera, el BroadcastReceiver será parte independiente de su actividad (y no dependerá del Ciclo de Vida de Actividad)

esta manera, su BroadcastReceiver será notificado automáticamente por Android, tan pronto como un SMS llegan incluso si su aplicación está cerrada.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest> 
    ... 
    <uses-permission android:name="android.permission.READ_SMS"/> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

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

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent != null) { 
      String action = intent.getAction(); 
      if(action != null) { 
       if(action.equals("android.provider.Telephony.SMS_RECEIVED")) { 
        // DO YOUR STUFF 
       } else if (action.equals("ANOTHER ACTION")) { 
        // DO ANOTHER STUFF 
       } 
      } 
     } 
    } 
} 

Notas

Se pueden añadir otros intención de filtros para AndroidManifest y manejar todos ellos en BroadcastReceiver misma.

Inicie un servicio solo si va a realizar una tarea larga. Solo necesita mostrar una notificación o actualizar alguna base de datos, solo use el código anterior.

+0

Si la aplicación se bloquea con demasiada frecuencia o el usuario fuerza la detención de la aplicación, no se relanzará en los eventos de difusión – basin

Cuestiones relacionadas