studio servicios servicio segundo saber plano example esta ejemplo detener definicion corriendo como android broadcastreceiver

servicios - Android BroadcastReceiver al inicio: sigue funcionando cuando la actividad está en segundo plano



service android definicion (2)

Estoy monitoreando SMS entrantes.

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

¿Cómo puedo conseguir esto? He revisado el ciclo de vida de 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 SMS entrantes.

¿Cómo puedo hacer que esto sea persistente?

Gracias


Debe definir un receptor en manifiesto con el nombre de 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"/>

Use el Service para esto para que todo persista. Y use 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 definirlo 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); } }


Servicio o arranque completo no es obligatorio

De hecho, no necesita implementar un Service o registrarse en android.intent.action.BOOT_COMPLETED

Algunos ejemplos muestran cómo registrar / anular el registro de un BroadcastReceiver cuando se crea y destruye una actividad. 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 se abre la aplicación).

Hay otra manera

Puede crear una class que extienda BroadcastReceiver y registrarse a los intentos deseados a través de AndroidManifest.xml . De esta forma, el BroadcastReceiver será independiente de su actividad (y no dependerá del ciclo de vida de la actividad)

De esta forma, su BroadcastReceiver será notificado automáticamente por Android tan pronto como llegue un SMS, 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

Puede agregar otros filtros de intención a AndroidManifest y manejarlos todos en el mismo BroadcastReceiver .

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.