Contactos

Comunicación entre actividad y servicio. Cambiar entre las pantallas de la aplicación Transmisión de datos entre Activati

De alguna manera, tuve una tarea para transferir datos del servicio a Activat. Comenzó la búsqueda de soluciones en el SDK estándar, pero como no hubo tiempo, luego voló una mala solución como un uso de la base de datos. Pero la pregunta se abrió y después de un tiempo me di cuenta de una forma más correcta, que está en SDK, utilizando las clases de mensaje, controlador, mensajero.

Ocurrencia

Necesitamos transmitir datos de Activat a Service y Atrás. ¿Cómo lo hacemos? Para resolver nuestra tarea, ya tenemos todo lo que necesita. Todo lo que necesita es enlazar el servicio a la atitividad usando Bindservice, transfiera los parámetros deseados y un poco de magia en forma de usar clases de mensajes. Y la magia es usar las variables de instancia de mensajes y, en particular, responda. Esta variable es necesaria para que podamos consultar la instancia de servicio Messanger desde Activati \u200b\u200by en el servicio a la copia de Messanger, una. De hecho, no tan simple. Al menos por mi no la mente más dotada. En parte, solo mejoré la documentación que ya es: servicios también, hay buen ejemplo en StackOverflow. En cualquier caso, espero que el artículo sea útil al menos a alguien y no nos atreví a no en vano.

Ejemplo

Como ejemplo, estamos implementando un servicio que aumentará y reducirá el valor del mostrador y devolverá el resultado en Activati \u200b\u200ben TextView. Se omite el código de diseño, ya que hay dos botones y un campo de texto, todo es simple.

Ventas

Le daré un código completamente activado:

MAINACTENCIA DE CLASE PÚBLICA ANTENDIENDA LA ACTIVIDAD (PUBLICATE FINAL STRING TAG \u003d "TESTSERVICE"; TESTSERVICECONNECCIÓN DE TESTSERVCONN; TESTTTXT TESTTTX; Messenger de Messenger final \u003d Nuevo Messenger (New IncomingHandler ()); Messenger Toservicemessenger; @Override Public Void Oncreate (Súper. OneCreate (SavedInstancestate); setcontentview; testtxtxt \u003d (textView) findworkbyid (r.id.test_txt); enlace (nueva intención), (testservconn \u003d nuevo testserviceconnection ()), contexto .bind_auto_create);) @Override Public Void Onestroy () ( super.ondosdestroy (); Desbordamiento (TestServconn);) Control de voides públicos (botón de vista) (nulo, testservice.count_plus); msg.replyto \u003d messenger; intente (toservicemessenger.send (msg);) captura (e.printstacktrace () ;)) Control de recocrCrCrCrclick (NULL, NULL, TESTSERVICE.COUNT_MINUS); MSG .Replyto. \u003d Messenger; Intente (toservicemessenger.send (msg);) captura (e.printstacktrace ();)) La clase privada incominghandler extiende el controlador (@Override Public Void HandleMessage (Msg.What) (Test Service. Get_count: log.d (etiqueta "( Actividad) ... obtenga contar "); testtxt.settext (" "+ msg.arg1); ruptura;))) Prueba privada de la claseVicServiceconnection Implementa ServiceConnection (@Override Public Void OnServicEnnectect (nombre de componente, servicio de Ibinder) (Toservicemessenger \u003d New Messenger ; // Envíe el valor inicial del mensaje msg \u003d mensaje.obtain contador (nulo, testservice.set_count); msg.replyto \u003d messenger; msg.arg1 \u003d 0; // nuestro contador intento (toservicemessenger.send (msg);) Captura (remoteexcepción E) (E.PrintStackTrace ();)) @Override Public Void OnServiceConnectected (ComponentName Nombre)))

Lo explicaré. Al crear Activat, estamos inmediatamente vinculados al servicio, implementando la interfaz de servicio de servicio y envíe un mensaje al servicio "Establezca el valor del contador", pase a cero y cree un toservicemessanger, pasando la interfaz de Ibinder al diseñador. Por cierto, en el servicio es necesario devolver este Ehemple, de lo contrario habrá NPE. Con esta clase, enviamos el mensaje al servicio. Y aquí es mágico: guardamos nuestra otra instancia de mensajero a la variable de respuesta a la variable, la que recibe una respuesta del servidor y es a través de ella que se comunicará con Activat.

Para recibir un mensaje del servicio, use su manejador y solo busca variables que necesitamos y hagas medidas en ellas. Por clics en los botones (CondeCRCrClick, CondeCrlick Methods), envíe solicitudes al servicio, especificando la acción deseada en el MSG.Qué variable.

Paquete com.example.servicetest; Importar Android.App.Service; Importar Android.Content. *; Importar Android.os. *; Importar Android.os.Process; Importar android.util.log; Testservice de clase pública extiende el servicio (Final de Final de Final de Estático Público \u003d 1; Final estática pública Intinte_minus \u003d 2; Final estático estático INT SET_COUNT \u003d 0; PUBLIC estático estático Final int get_count \u003d 3; INT Count \u003d 0; Inhandler de Messenger Messenger; Messenger toactivitymessenger; @Override Public Void Oncreate () (super.oncreate (); HandlerThread Hilo \u003d Nuevo HandlerThread ("ServicesArtArtArguments", Process.Thread_Priority_Background); Hilo.start (); Inhandler \u003d New IncomingHandler (hilo.getlooper ()); Messanger \u003d Nuevo Messenger (inhandler);) @Override Public Ibinder Onbind (Regreso Messanger.getBinder ();) @Override Public Intent OnStartCommand (Devolver Start_Sticky;) // Mensaje Handler Actividades Private Class IncomingHandler extiende el manejador (Super Looper) (Looper Looper) (Looper Looper) @Override Public Void Handlemessage (Mensaje Mensaje) (//Super.Handlemessage(msg); TactivityMess enger \u003d msg.replyto; Interruptor (msg.what \u003d msg.arg1; log.d (mainactivity.tag "," (servicio) ... set cuenta "); descanso; Case cuenta_plus: Count ++; log.d (mainactivity.tag" (servicio ) ... cuenta plus "); descanso; Case cuenta_minus: log.d (mainactivity.tag," (servicio) ... contar menos "); cuenta--; romper;) // enviar un valor medidor en el mensaje de activación OUTMSG \u003d Message.Obtain (inhensa, get_count); OUTMSG.ARG1 \u003d CUENTA; Outmsg.Replyto \u003d Messanger; Intente (si (toActivityMessenger! \u003d Null) toactivitymessenger.send (upmsg);) captura (e.printstacktrace ();))))

Todo por analogía con lógica en Activiti. Ni siquiera sé si necesitas explicar algo. El único momento es que inmediatamente envíe una solicitud de vuelta a Activat en HandleMessage, usando la variable Magic Variables PonyTo y tirar del mensajero anterior arriba. Y el segundo momento que ya dije es:

@Override Public Ibinder Onbind (Intención ARG0) (devuelva Messanger.getBinder ();)

sin que todo cae. Es esta instancia de la interfaz que se transmitirá a ServiceConnection.

Conclusión

En general, todo. Tal ejemplo de interacción de la interacción de la activación y el servicio. Me parece que la interacción no trivial es bonita, aunque alguien puede parecer lo contrario.

Preguntas, aclaraciones y otros en PM. Puede haber inexactitudes sobre cualquier aspecto, así que siéntase libre de escribir y enderezar.
Espero que la publicación sea útil para los lectores.

Última actualización: 04/03/2018

Para transferir datos entre dos actividades, se utiliza un objeto de intención. A través de su método PUTEXTRA (), puede agregar la clave y el valor asociado.

Por ejemplo, transmitiendo desde la actividad actual en las cadenas de "Hello World" con la clave "Hola":

// creando un objeto de intención para iniciar la secundaria Intens intens \u003d nueva intención (esta, la segundaCertivity.class); // Transferencia de un objeto con la tecla "Hola" y el valor "Hello World" de intent.putextra ("Hola", "Hello World"); // iniciar la iniciación de la secundaria (intención);

El método PUTEXTRA () se usa para transmitir datos, que como un valor le permite transferir los tipos más simples de datos de tipo: cadena, int, flotador, doble, largo, corto, byte, char, las matrices de estos tipos, o el Objeto de interfaz serializable.

Para obtener los datos enviados al cargar la secundación, puede usar oBTENER.(), en el que se transmite el objeto:

Argumentos del paquete \u003d getIntent (). GetExtras (); Nombre de la cadena \u003d argumentos. Post ("hola"). Tostring (); // Hola Mundo.

Dependiendo del tipo de datos enviados, cuando se recibe, podemos usar varios métodos de objeto de paquete. Todos ellos aceptan la clave de objeto como un parámetro. Los principales son:

    obtener (): método universalque devuelve el valor del tipo de objeto. En consecuencia, el campo de recibo debe convertirse en el tipo deseado

    getstring (): devuelve la cadena de tipo de objeto

    getint (): devuelve el valor del tipo int

    getByte (): Devuelve el valor del tipo de byte

    getchar (): devuelve el valor de tipo char

    getshort (): devuelve un valor de tipo corto

    getlong (): devuelve un valor largo

    getfloat (): devuelve el valor del tipo flotante

    getDouble (): devuelve un valor doble

    getBoolean (): devuelve un valor de tipo booleano

    getChararray (): devuelve una matriz de objetos de char

    getintarray (): devuelve una matriz de objetos INT

    getfloatarray (): devuelve una matriz de objetos de flotador

    getSerializizable (): devuelve el objeto de interfaz serializable

Permítanos en el proyecto se definirá dos actividades: la principal autorización y la secundabilidad.

En el código de la secundaria determinaremos los datos que obtienen:

Paquete com.example.eugene.serializEapp; Importar android.support.v7.app.appCompatactivity; Importar android.os.bundle; Importar Android.Widget.TextView; La segunda licitación de la clase pública se extiende la compatibilidad de la aplicación (@Override protegido de Void Oncreate (Bundle SavedInstanceStancate) (super.oncreate (SavedInstancuestro); TextView TextView \u003d Nuevo TextView (esto); TextView.SetaxTsize (20); TextView.SETPADDING (16, 16, 16, 16 16 ); Argumentos del paquete \u003d getIntent (). GetExtras (); ¿Si (argumentos! \u003d Nulo) (Nombre de la cadena \u003d argments.get). Tostring (); String Company \u003d arguments.gentstring ("empresa"); int precio \u003d argumentos getint ("precio"); textView.settxt ("Nombre:" + Nombre + "\\ NCompany:" + Company + "\\ nPrecio:" + Precio);) SetContentView (TextView);)))

En este caso, en la segunda licitación obtenemos todos los datos del objeto del paquete y se muestran en el cuadro de texto TEXTVIEW. Se supone que esta actividad se transmitirá tres elementos: dos filas con nombres y claves de la empresa y una clave con un precio clave.

Ahora definiremos la transferencia a la secundaria de los datos. Por ejemplo, definimos la siguiente interfaz para la principal autorización en el archivo Activity_Main.xml:

¿Te gustó el artículo? Compártelo