Servicio de enlace por BroadcastReceiver

Mi aplicación utiliza un servicio que es iniciado por un BOOT_COMPLETE BroadcastReceiver, en ejecución estoy recibiendo un error

mi código:

public class projet extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { intent = new Intent(context, ScreenshotService.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.bindService(intent, aslServiceConn, Context.BIND_AUTO_CREATE); } } 

error:

 java.lang.RuntimeException: Unable to start receiver com.example.projet: android.content.ReceiverCallNotAllowedException: BroadcastReceiver components are not allowed to bind to services 

Uno no debe enlazar un servicio de Broadcast receptor. La razón es que los receptores de radiodifusión son componentes ligeros, donde tiene que terminar su funcionalidad en no más de 10 segundos como máximo . Otro android puede matar con fuerza a su receptor. Enlazar (establecer conexión a) un servicio puede tardar más de 10 segundos en algunos casos peores, por eso Android no lo permite.

Reglas para los receptores de radiodifusión:

  1. Los receptores de difusión no tendrán ninguna UI (en su mayoría) y tendrá sólo lógica de fondo.
  2. Los receptores de difusión tendrán el límite máximo de tiempo de 10 segundos para terminar su funcionalidad de lo contrario se bloqueará.
  3. No debe realizar operaciones largas o operaciones asíncronas en el receptor. Ejemplo: a. Preparación de la tarjeta SD. segundo. Subir / descargar archivos desde Internet. do. Creación de archivos Db. re. Vinculación a servicios
  4. No mostrar diálogo al usuario en el receptor de difusión. (Esto es la operación asincrónica)
  5. Puede utilizar "tostadas" o "Notificaciones".
  6. No escriba ninguna funcionalidad pesada.

Ref. Tomada del desarrollador android

Si sabe que el Service está en ejecución, puede adquirir su archivo Binder con BroadcastReceiver.peekService(Context, Intent) (Ver los documentos de peekService ).

Pero, como ya se ha dicho en las otras respuestas, no está permitido enlazar un Service desde dentro de un BroadcastReceiver .

La mejor manera es iniciar primero un IntentService desde BroadcastReceiver.onReceive() usando:

 context.StartService(new Intent(context, YourIntentService.class)); 

A continuación, en el IntentService.onHandleIntent() :

 @Override protected void onHandleIntent(Intent intent) { mContext = getApplicationContext(); mContext.bindService(new Intent("com.ServiceToBind.BIND"), yourConnection, Context.BIND_AUTO_CREATE); } 

Problema

BroadcastReceiver s no están autorizados a estar vinculados a un Service como las otras respuestas aquí han indicado.

Solución

Una solución simple que he utilizado es reenviar el Intent recibido por el BroadcastReceiver al servicio que originalmente quería enlazar, a continuación, implementar algún código en el método onStartCommand() ese servicio para manejarlo.

De acuerdo con la documentación bindService:

Nota: este método no se puede llamar desde un componente BroadcastReceiver. Un patrón que puede utilizar para comunicarse desde un BroadcastReceiver a un Servicio es llamar a startService (Intent) con los argumentos que contienen el comando a enviar, con el servicio llamando a su método stopSelf (int) cuando haya terminado de ejecutar ese comando.

Lo que hice: (No estoy seguro de si funciona en todos los casos) Puede crear un Servicio e iniciar ese servicio en su BroadcastReceiver. Dentro de su servicio onCreate () método, puede llamar a un método de otra clase que está a cargo de la vinculación. Puede pasar el contexto de servicio a esa clase y utilizarlo de esta manera: ctx.bindService (…)

BroadcastReceiver no puede enlazarService. Puede obtener una buena solución en la siguiente URL:

Android – Iniciar el servicio en el arranque

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.