Service de liaison par BroadcastReceiver
Mon Application utilise un service est démarré par un BOOT_COMPLETE BroadcastReceiver, dans l'exécution j'obtiens une erreur
mon code:
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);
}
}
erreur:
java.lang.RuntimeException: Unable to start receiver com.example.projet: android.content.ReceiverCallNotAllowedException: BroadcastReceiver components are not allowed to bind to services
source d'informationauteur yasso
Vous devez vous connecter pour publier un commentaire.
Il ne faut pas lier un service à partir de récepteur de Radiodiffusion.
La raison en est les récepteurs de radiodiffusion sont des composants légers, où il a pour la finition de ses fonctionnalités avec des dans pas plus de 10 secondes maximum. D'autre android avec force de tuer votre récepteur. De liaison (établissement de la connexion), un service peut prendre plus de 10 secondes dans le pire des cas, c'est pourquoi android ne permettra pas à elle.
Règles pour Récepteurs de Radiodiffusion:
Exemple: un. La préparation de la carte SD.
b. Le téléchargement /Téléchargement de fichiers à partir d'internet.
c. La création de fichiers Db.
d. La liaison aux services
Ref prises de développeur android
Si vous savez que le
Service
est en cours d'exécution, vous pouvez acquérir sonBinder
avecBroadcastReceiver.peekService(Context, Intent)
méthode (VoirpeekService
docs).Mais, comme il est déjà dit dans les autres réponses, il n'est pas permis de lier un
Service
de l'intérieur d'uneBroadcastReceiver
.Meilleure façon est de commencer d'abord un
IntentService
deBroadcastReceiver.onReceive()
à l'aide de:Puis dans le
IntentService.onHandleIntent()
:Problème
BroadcastReceiver
s ne sont pas autorisés à être lié à unService
que les autres réponses ici ont indiqué.Solution
Une solution simple que j'ai utilisé est de transmettre la
Intent
reçu par leBroadcastReceiver
pour le service que vous vouliez à l'origine à lier, puis de mettre en œuvre une partie du code que du serviceonStartCommand()
méthode pour gérer.lire http://developer.android.com/reference/android/content/BroadcastReceiver.htmlla section Récepteur du Cycle de vie
Selon bindService documentation:
Ce que j'ai fait:
(Pas sûr si cela fonctionne dans tous les cas)
Vous pouvez créer un Service et démarrer le service dans votre BroadcastReceiver. À l'intérieur de votre service onCreate() la méthode, vous pouvez appeler une méthode d'une autre classe qui est en charge de la liaison. Vous pouvez passer le contexte de service à la classe et l'utiliser comme ceci: ctx.bindService(...)
BroadcastReceiver cann pas bindService.
Vous pouvez obtenir une bonne solution à l'URL suivante:
Android - Démarrer le service au démarrage
De simples.
Opt 1:
J'ai créé un vide Activité (non de l'INTERFACE utilisateur, juste onCreate() pour Lier de service) et de fin().
En Broadcast > Démarrer l'Activité avec Bundle (si nécessaire). Le problème est résolu.
Opt 2:
De la même façon options ci-dessus mais en utilisant un Service au lieu de l'Activité.
Obtenez de l'événement de Diffusion > lancer un nouveau Service > Bind de Service existant que vous voulez lier.