Contacts

Communication entre activité et service. Basculer entre les écrans d'application Transmission de données entre Activati

D'une manière ou d'une autre, j'ai eu une tâche de transférer des données du service à Activat. La recherche de solutions dans le SDK standard a commencé, mais comme il n'y avait pas de temps, alors a volé une mauvaise solution en tant que base de données. Mais la question a été ouverte et après un certain temps, j'ai compris avec une manière plus correcte, qui est en SDK - en utilisant les classes de message, gestionnaire, messager.

Idée

Nous devons transmettre des données d'Activat au service et à votre retour. Comment faisons-nous ça? Pour résoudre notre tâche, nous avons déjà tout ce dont vous avez besoin. Tout ce dont vous avez besoin est de lier le service à l'atitivité à l'aide de BINDService, transférez les paramètres souhaités et un peu de magie sous la forme de classes de messages. Et la magie consiste à utiliser les variables d'instance de message et en particulier ReplyTo. Cette variable est nécessaire pour nous afin que nous puissions faire référence à l'instance de service Messanger d'Activati \u200b\u200bet au service à la copie de Messanger-une copie. En fait, pas si simple. Au moins pour mon esprit le plus doué. En partie, j'améliore simplement la documentation qui est déjà - les services également, il existe un bon exemple sur Stackoverflow. En tout état de cause, j'espère que l'article sera utile au moins quelqu'un et je n'ai pas osé pas en vain.

Exemple

Par exemple, nous mettons en œuvre un service qui augmentera et réduira la valeur du compteur et renvoie le résultat dans Activati \u200b\u200bdans TextView. Le code de mise en page est omis, car il y a deux boutons et un champ de texte - tout est simple.

Ventes

Je vais donner un code entièrement activat:

MainAlactivité de la classe publique Étend Activité (Static String Tag \u003d "TestService"; Testserviceconnection TestServconn; TextView Testtxt; Messenger Final Messenger \u003d New Messenger (Nouveau Messenger (nouveau Incominghandler ()); Messenger ToserviceMessenger; @Override Public Void OnCreate (Bundle SavedInstancestate) (Super. Oncreate (SavedInstanCestate); SetContentView; Testtxxt \u003d (TextTextTxt \u003d (TextVietTexte) (r.id.test_txt); BindService (nouvel intention), (testServconn \u003d nouveau testserviceconnection ()), contexte .bind_auto_create);) @Override publique annulation oitroy () ( Super.ondeSestroy (); Unbindservice (TestServconn);) Public Noid Countincrcliquez (Bouton d'affichage) (NULL, TESTSERVICE.COUNT_PLUS); MSG.ReplyTo \u003d Messenger; essayez (ToserviceMessenger.Send (MSG);) Catch (E.PrintStackTrace () ;)) Public Void CountDecllick (Bouton Afficher) (NULL, TESTSERVICE.COUNT_MINUS); MSG .Replyto. \u003d messager; Essayez (Toservicemessenger.send (msg);) Catch (E.PrintStackTrace ();));)) La classe privée Incominghandlerler étend le gestionnaire (@override publique vide handlemessage (msg.Que) (TestService de cas. get_count: log.d (étiquette) ( Activité) ... Obtenir le compte "); Testtxt.setText (" "+ msg.arg1); pause;))))) Testserviceconnection de classe privée Confient ServiceConnection (@Override Public Void Onserviceconnected (Nom de la composeName, Ibinder Service) (ToserviceMessenger \u003d New Messenger) ; // Envoie la valeur initiale du message MSG \u003d Message.Obtain Compteur (NULL, testService.set_count); msg.replyto \u003d Messenger; msg.arg1 \u003d 0; // Notre compteur Essayez (ToserviceMessenger.Send (MSG);) Catch (RemoteeException E) (E.PrintStackTrace ();) @override Public Void OnserviceSischeconnected (Nom de la nomenneName)))

Je vais expliquer. Lors de la création d'Activat, nous sommes immédiatement liés au service, en implémentant l'interface ServiceConnection et envoyez un message au service "Définir la valeur de compteur", en passant à zéro et à la création d'un ToserviceMessanger, en passant l'interface Ibinder sur le concepteur. Au fait, dans le service, il est nécessaire de renvoyer ce eHemple, sinon il y aura NPE. Avec cette classe, nous envoyons le message au service. Et voici la magie - nous enregistrons notre autre instance de messagerie à la variable ReplyTo - celui qui reçoit une réponse du serveur et c'est à travers celui-ci qui communiquera avec Activat.

Pour recevoir un message du service, utilisez votre gestionnaire et recherchez simplement des variables dont nous avons besoin et de faire une action sur eux. Par clics sur les boutons (CountinCrcrCllick, CountDecllick Méthodes), envoyez des demandes au service, spécifiant l'action souhaitée dans la variable msg.Que.

Package com.example.serviceTest; Import android.app.service; Import android.content. *; Importer Android.os. *; Importer Android.os.Processes; Importer Android.Util.log; Public Class TestService prolonge le service (finale statique du public INT Nombre_PLUS \u003d 1; finale statique publique INT Nombre_minus \u003d 2; Public statique finale int Set_Count \u003d 0; Public statique finale int get_count \u003d 3; int compte \u003d 0; Incominghandler inhhandler; Messenger Messanger; Messenger toactivitéMessenger; @Override public vide surcreee () (Super.oncreate (); Thread Handlerthread \u003d nouveau manutention ("ServiceSarTarguments", processus.thready_priority_background); thread.start (); Incominghandler (thread.getlooper ()); Messanger \u003d Nouveau messager (inhhandler);) @override publique Ibinder ONBIND (Retour Messanger.getBinder ();) @Override Intention publique OnstartCommand (Retour Start_Sticky;) // Activités du gestionnaire de messages Incominghandlert Extend Handler (Super Looper) (Looper) (Looper Looper) @override Public Void Handlemessage (Message MSG) (//super.handlemessage(MSG); toactivitymess Enger \u003d msg.replyto; Commutateur (msg.what \u003d msg.arg1; log.d (MainActivity.tag, "(Service) ... Ensemble de comptage"); casse-caisse Nombre_plus: Comptez ++; log.d (mainActivity.dag, " ) ... comte plus "); casse-caisse comptage_minus: log.d (MainAlyCity.tag," (service) ... comptage moins "); Compter--; Break;) // Envoyer une valeur de compteur dans le message d'activation OUTMSG \u003d Message.Obtain (InAver, Get_Count); outmsg.arg1 \u003d compte; outmsg.replyto \u003d Messanger; Essayez (si (toactivitéMessenger! \u003d Null) toactivityMessenger.send (OutMSG);) Catch (E.PrintStackTrace ();)))))))))))))))))))))))))))))))

Tout par analogie avec logique dans Activiti. Je ne sais même pas si vous avez besoin d'expliquer quelque chose. Le seul moment est que j'envoie immédiatement une demande à Activat dans ManuLemessage, en utilisant la variable magique ReplyTo et tirant le messager ci-dessus ci-dessus. Et le deuxième moment que j'ai déjà dit est:

@Override publique Ibinder ONBIND (Intention Arg0) (retour Messanger.getBinder (););)

sans quel tout tombe. C'est cette instance d'interface qui sera transmise à ServiceConnection.

Conclusion

En général, tout. Exemple d'interaction aussi artificiel d'activation et de service. Il me semble que l'interaction non triviale est jolie, bien que quelqu'un puisse sembler autrement.

Questions, clarifications et autres dans les PM. Il peut y avoir des inexactitudes sur tous les aspects, alors n'hésitez pas à écrire et à redresser.
J'espère que le poste était utile aux lecteurs.

Dernière mise à jour: 04/03/2018

Pour transférer des données entre deux activités, un objet d'intention est utilisé. Grâce à sa méthode Putextra (), vous pouvez ajouter la clé et la valeur associée.

Par exemple, transmettant de l'activité actuelle dans les chaînes "Bonjour World" de secondagity avec la clé "Bonjour":

// la création d'un objet d'intention de lancer de la secondactivity intens intense \u003d nouvelle intention (ceci, secondactivity.class); // transfert d'un objet avec la clé "Hello" et la valeur "Hello World" de l'intention.putextra ("Bonjour", "Bonjour World"); // démarrage de la démarrage de secondactivité (intention);

La méthode Putextra () est utilisée pour transmettre des données, ce qui, comme une valeur vous permet de transférer les types de données de type simples de type, int, flotteur, double, long, court, octet, char, les tableaux de ces types, ou Objet d'interface sérialisable.

Pour obtenir les données envoyées lors du chargement de secondactivity, vous pouvez utiliser oBTENIR.(), dans lequel l'objet est transmis:

Bundle arguments \u003d getintent (). GetExtras (); Nom de cordes \u003d arguments.get ("Bonjour"). Tostring (); // Bonjour le monde.

Selon le type de données envoyé, lors de la réception, nous pouvons utiliser un certain nombre de méthodes d'objet de paquet. Tous acceptent la clé d'objet comme paramètre. Les principaux sont:

    obtenir (): méthode universellequi renvoie la valeur du type d'objet. En conséquence, le champ de réception doit être converti au type souhaité.

    getString (): retourne la chaîne de type d'objet

    getint (): retourne la valeur de type int

    getByte (): Retourne la valeur du type d'octet

    getchar (): retourne la valeur de type char

    gethort (): retourne une valeur de type courte

    getLong (): retourne une valeur longue

    getFlove (): Retourne la valeur de Type Float

    getdouble (): retourne une double valeur

    gETBOOLEAN (): Retourne une valeur de type booléen

    getchararray (): renvoie une gamme d'objets de caractère

    getintarray (): retourne un tableau d'objets int

    getfloatarray (): retourne un tableau d'objets de flotteur

    obtiendable (): Retourne l'objet d'interface Serializable

Permettez-nous dans le projet deux activités suivantes: MainAlactivité et secondactivité.

Dans le code de secondactivité, nous déterminerons les données obtenant:

Package com.example.eugene.serializeApp; Importer Android.Support.v7.app.app.appCompatiactivité; Importer android.os.bundle; Importer android.widget.textview; La classe d'enseignement de la classe publique étend l'appelcompativactivité (@override protégé Void Oncreate (Bundle SavedInstateTate) (Super.Oncreate (SavedInstancestate); TextView TextView \u003d Nouveau TextView (this); TextView.setextsize (20); TextView.Settypadding (16, 16, 16, 16 ); Bundle arguments \u003d getintent (). GetExtras (); si (arguments! \u003d Null) (String Name \u003d Argments.get). ToString (); String Company \u003d Arguments.Getstring ("Société"); Int Prix \u003d Arguments. getint ("prix"); textview.setText ("Nom:" + nom + "\\ NCompany:" + société + "\\ Nprice:" + prix);) setContentView (textview););

Dans ce cas, dans la deuxièmeactivité, nous obtenons toutes les données de l'objet Bundle et les affichent dans la zone de texte TextView. On suppose que cette activité sera transmise trois éléments - deux lignes avec noms et clés de la société et une clé avec un prix clé.

Nous définirons maintenant le transfert à la deuxièmeactivité des données. Par exemple, nous définissons l'interface suivante pour la MainActivity dans le fichier Activity_Main.xml:

Avez-vous aimé l'article? Partagez-le