J'essaie d'écrire un simple lecteur multimédia qui lit les flux audio en utilisant RTSP. J'ai une activité graphique et un service qui effectue la lecture. Ma question est de savoir comment mieux communiquer entre l'activité et le service (par exemple, mettre à jour l'interface graphique en fonction de l'état du lecteur).
Je sais que je peux lier le service à l'activité à l'aide de onBind (), mais si je comprends bien, cela arrêtera le service si l'activité est supprimée. Je souhaite continuer la lecture même si l'utilisateur quitte l'activité. Existe-t-il un moyen standard ou préféré de traiter ce problème?
"Si vous démarrez un Android Service avec startService(..)
), ce service restera actif jusqu'à ce que vous appeliez explicitement stopService(..)
. Il existe deux raisons pour lesquelles un service peut être Si quelqu'un appelle Context.startService()
, le système récupère le service (le crée et appelle sa méthode onCreate()
si nécessaire), puis appelle sa onStartCommand(Intent, int, int)
avec les arguments fournis par le client. À ce stade, le service continue à fonctionner jusqu'à l'appel de Context.stopService()
ou stopSelf()
. Notez que plusieurs appels à Context.startService()
ne le sont pas. imbriquent (bien qu'ils aboutissent à plusieurs appels correspondants à onStartCommand()
), donc peu importe le nombre de démarrages, un service sera arrêté une fois Context.stopService()
ou stopSelf()
est appelé, mais les services peuvent utiliser leur méthode stopSelf(int)
pour s’assurer qu’ils ne sont pas arrêtés tant que leurs intentions n'ont pas été traitées.
Les clients peuvent également utiliser Context.bindService()
pour obtenir une connexion persistante à un service. De même, cela crée le service s'il n'est pas déjà en cours d'exécution (appelant onCreate()
en même temps), mais n'appelle pas onStartCommand()
. Le client recevra l'objet IBinder
que le service renvoie de sa méthode onBind(Intent)
, permettant ainsi au client de rappeler le service. Le service restera actif tant que la connexion sera établie (que le client conserve ou non une référence sur le IBinder
du service). Habituellement, le IBinder
renvoyé correspond à une interface complexe écrite en AIDL.
Un service peut être à la fois démarré et lié à des connexions. Dans un tel cas, le système continuera à faire fonctionner le service aussi longtemps qu'il sera démarré ou s'il aura une ou plusieurs connexions avec l'indicateur Context.BIND_AUTO_CREATE
. Si aucune de ces situations ne se vérifie, la méthode onDestroy()
du service est appelée et le service est effectivement terminé. Tout le nettoyage (arrêt des threads, désinscription des destinataires) doit être terminé lors du retour de onDestroy()
. "
Tout d'abord, 2 choses que nous devons comprendre
il fait la demande à un serveur spécifique
bindService(new
Intent("com.Android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);`
ici mServiceConn
est une instance de ServiceConnection
class (intégrée), c’est en fait une interface que nous devons implémenter avec deux méthodes (la première pour le réseau connecté et le second réseau non connecté) pour surveiller l’état de la connexion réseau.
réponse d'envoi du serveur avec IBind Object.so L'objet IBind est notre gestionnaire qui accède à toutes les méthodes de service à l'aide de l'opérateur (.).
MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.d("ServiceConnection","connected");
myService = binder;
}
//binder comes from server to communicate with method's of
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
}
myservice.serviceMethod();
ici myService
est un objet et serviceMethode
est une méthode en service. Et de cette manière, la communication est établie entre le client et le serveur.
J'ai essayé d'appeler
startService(oIntent);
bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
par conséquent, je pourrais créer un service collant et me lier à celui-ci. Didacticiel détaillé pour exemple de service lié .
Il existe une méthode appelée nbindService qui prend un ServiceConnection que vous aurez créé lors de l'appel de bindService. Cela vous permettra de vous déconnecter du service tout en le laissant en marche.
Cela peut poser un problème lorsque vous vous reconnectez, car vous ne savez probablement pas si elle s'exécute ou non lorsque vous relancez l'activité. Vous devrez donc en tenir compte dans votre code d'activité.
Bonne chance!