Page 152
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
Mostrar la interfaz desde la clase SMSWriter
Una vez declarada completamente la interfaz de usuario en un documento XML dentro
de la carpeta “\res\layout”, solamente es necesario referenciarla dentro del código fuente
de SMSWriter. El método setContentView() de la clase Activity es la única
llamada que es necesaria hacer para construir y mostrar completamente al usuario la
interfaz. El elemento que la referencia, en el caso aquí descrito, es R.layout.sms.
Sin embargo, si se desea hacer un control adicional de algunos de los elementos como,
por ejemplo, captar sus eventos asociados, es necesario instanciarlos individualmente
para tener un objeto que poder controlar. Esta instanciación es tan simple como la
anterior. El siguiente código muestra cómo se referencia la interfaz completa y se
__rendered_path__11
instancia alguno de sus elementos para poder controlarlos:
__rendered_path__47
__rendered_path__45__rendered_path__47
public class SMSWriter extends Activity{
__rendered_path__48
__rendered_path__47
@Override
__rendered_path__47
protected void onCreate(Bundle savedInstanceState) {
__rendered_path__49
__rendered_path__49
super.onCreate(savedInstanceState);
__rendered_path__50
__rendered_path__57
// Construir interfaz completa
__rendered_path__57
setContentView(R.layout.sms);
__rendered_path__58
__rendered_path__60
// Instanciar algunos elementos de la interfaz
__rendered_path__60
EditText editNumber = (EditText) findViewById(R.id.number);
__rendered_path__58
EditText editSMS = (EditText) findViewById(R.id.message);
__rendered_path__60
Button button1 = (Button) findViewById(R.id.button1);
__rendered_path__60
Button button2 = (Button) findViewById(R.id.button2);
__rendered_path__58
__rendered_path__60
// Obtener número del destinatario
__rendered_path__60
Bundle extras = getIntent().getExtras();
__rendered_path__50
__rendered_path__57
// Mostrarlo dentro de la caja de texto
__rendered_path__57
editNumber.setText(extras.getString("number"));
__rendered_path__58
editNumber.setFocusable(false);
__rendered_path__60
__rendered_path__60
// ...
__rendered_path__58
__rendered_path__60
}
__rendered_path__60
}
__rendered_path__50
__rendered_path__57
__rendered_path__57
Código 56. Utilizar recursos XML para instanciar la interfaz de usuario
__rendered_path__75
__rendered_path__80
__rendered_path__80
El método findViewById(), de la clase Activity, permite instanciar de forma
__rendered_path__50
inmediata cualquier elemento de interfaz declarado en la carpeta de recursos. Cada
__rendered_path__57
instancia se realiza haciendo un casting a la clase correspondiente y utilizando el
__rendered_path__57
Jaime Aranaz Tudela
152
__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__75__rendered_path__80__rendered_path__80__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__58__rendered_path__106__rendered_path__108__rendered_path__110__rendered_path__112__rendered_path__60__rendered_path__60__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__50__rendered_path__118__rendered_path__120__rendered_path__57__rendered_path__57__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__58__rendered_path__60__rendered_path__60__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__75__rendered_path__80__rendered_path__80__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__50__rendered_path__57__rendered_path__57__rendered_path__75__rendered_path__80__rendered_path__80__rendered_path__45__rendered_path__136__rendered_path__136__rendered_path__137__rendered_path__136__rendered_path__136__rendered_path__49__rendered_path__49
Ingeniería en Informática

Page 153
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
identificador declarado en el XML. De esta forma, ya se puede trabajar con los objetos
obtenidos.
Mediante getIntent().getExtras() se obtienen los datos asociados al Intent que
ha lanzado la presente Activity; el único dato asociado aquí es el número de teléfono del
contacto al que se va a enviar el SMS. Este número se muestra en la caja de texto
correspondiente con setText() de la clase EditText, y además se configura para que
no pueda ser modificado, mediante el método setFocusable() y el valor false.
El siguiente control de elementos que se desea hacer es establecer los comportamientos
para los dos botones mostrados, el de enviar y el de borrar. Al pulsar el botón de enviar,
la Activity debe finalizar y retornar a la clase ContactMap el texto introducido por el
__rendered_path__11
usuario. Por su parte, al pulsar el botón de borrar, la caja de texto debe vaciarse por
completo.
Para configurar estos comportamientos se implementa el método onClick() de cada
botón. Esta implementación se hace, tal y como muestra el Código 57, a través de un
listener llamado setOnClickListener().
__rendered_path__62
__rendered_path__62
public class SMSWriter extends Activity{
__rendered_path__60__rendered_path__63
__rendered_path__62
@Override
__rendered_path__62
protected void onCreate(Bundle savedInstanceState) {
__rendered_path__64
__rendered_path__64
// (...)
__rendered_path__65
__rendered_path__72
// Botón de enviar
__rendered_path__72
button1.setOnClickListener(new View.OnClickListener() {
__rendered_path__73
__rendered_path__75
public void onClick(View view) {
__rendered_path__75
// Añadir el texto del SMS a los datos del Intent
__rendered_path__73
getIntent().putExtra(
__rendered_path__75
"message", editSMS.getText().toString());
__rendered_path__75
setResult(RESULT_OK,getIntent());
__rendered_path__65
// Finalizar Activity
__rendered_path__72
finish();
__rendered_path__72
}
__rendered_path__73
});
__rendered_path__75
__rendered_path__75
// Botón de borrar
__rendered_path__73
button2.setOnClickListener(new View.OnClickListener() {
__rendered_path__75
public void onClick(View view) {
__rendered_path__75
// Borrar texto
__rendered_path__73
editSMS.setText("");
__rendered_path__75
}
__rendered_path__75
});
__rendered_path__65
}
__rendered_path__72
__rendered_path__72
__rendered_path__73
Código 57. Comportamiento de los botones en la clase SMSWriter
__rendered_path__75
Jaime Aranaz Tudela
153
__rendered_path__75__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__98__rendered_path__102__rendered_path__102__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__98__rendered_path__102__rendered_path__102__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__73__rendered_path__75__rendered_path__75__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__98__rendered_path__102__rendered_path__102__rendered_path__65__rendered_path__72__rendered_path__72__rendered_path__137__rendered_path__139__rendered_path__139__rendered_path__140__rendered_path__139__rendered_path__139__rendered_path__141__rendered_path__141
Ingeniería en Informática

Page 154
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
Para devolver a ContactMap el texto que ha introducido el usuario, se añade este como
datos asociados al Intent. Además, se invoca el método finish() para dar por
terminada la presente actividad. En caso de pulsar el botón de borrar, el texto
introducido hasta el momento se borra utilizando setText() y la cadena vacía.
Enviar el contenido del mensaje
Al termina la actividad SMSWriter, el control vuelve a ContactMap desde el método
onActivityResult(). Desde esta clase, una vez recibido el texto que el usuario ha
introducido, se envía el SMS de la forma que sigue:
__rendered_path__11
__rendered_path__40
__rendered_path__38__rendered_path__40
public class ContactMap extends MapActivity {
__rendered_path__41
__rendered_path__40
// Contacto con el foco de la aplicación
__rendered_path__40
public Friend mCurrent = null;
__rendered_path__42
// Lista de contactos
__rendered_path__42
public ArrayList<Friend> mFriendList = new ArrayList<Friend>();
__rendered_path__43
__rendered_path__50
@Override
__rendered_path__50
protected void onActivityResult(int requestCode, int resultCode,
__rendered_path__51
Intent data) {
__rendered_path__53
__rendered_path__53
super.onActivityResult(requestCode, resultCode, data);
__rendered_path__51
__rendered_path__53
// Resultado de la Activity SMSWriter
__rendered_path__53
if (requestCode==1){
__rendered_path__43
__rendered_path__50
try{
__rendered_path__50
__rendered_path__51
// Obtener gestor de SMS
__rendered_path__53
SmsManager smsManager = SmsManager.getDefault();
__rendered_path__53
__rendered_path__51
// Enviar SMS con los datos devueltos
__rendered_path__53
smsManager.sendTextMessage(
__rendered_path__53
data.getExtras().getString("number"),
__rendered_path__51
null,
__rendered_path__53
data.getExtras().getString("message"),
__rendered_path__53
null,
__rendered_path__43
null);
__rendered_path__50
__rendered_path__50
// Mensaje de confirmación
__rendered_path__51
Dialog enviado = new Dialog(this);
__rendered_path__53
enviado.setTitle(R.string.successSMS);
__rendered_path__53
enviado.show();
__rendered_path__51
enviado.setCanceledOnTouchOutside(true);
__rendered_path__53
__rendered_path__53
}catch(Exception e){
__rendered_path__43
__rendered_path__50
__rendered_path__50
__rendered_path__83
__rendered_path__87
Jaime Aranaz Tudela
154
__rendered_path__87__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__83__rendered_path__87__rendered_path__87__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__43__rendered_path__105__rendered_path__50__rendered_path__50__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__83__rendered_path__87__rendered_path__87__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__83__rendered_path__87__rendered_path__87__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__51__rendered_path__53__rendered_path__53__rendered_path__43__rendered_path__50__rendered_path__50__rendered_path__83__rendered_path__87__rendered_path__87__rendered_path__152__rendered_path__154__rendered_path__154__rendered_path__155__rendered_path__154__rendered_path__154__rendered_path__156__rendered_path__156
Ingeniería en Informática

Page 155
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__12__rendered_path__14
// Mensaje de error
__rendered_path__15
Dialog enviado = new Dialog(this);
__rendered_path__14
enviado.setTitle(R.string.failSMS);
__rendered_path__14
enviado.show();
__rendered_path__16
enviado.setCanceledOnTouchOutside(true);
__rendered_path__16
}
__rendered_path__17
__rendered_path__21
}
__rendered_path__21
}
__rendered_path__17
}
__rendered_path__21
__rendered_path__21
__rendered_path__27
Código 58. Enviar SMS
__rendered_path__11__rendered_path__31
__rendered_path__31
__rendered_path__17
La clase SmsManager, presente en el paquete android.telephony.gsm, representa
__rendered_path__21
un gestor para los mensajes de texto. En particular, dispone del método
__rendered_path__21
sendTextMessage() para poder enviar mensaje de texto de tipo estándar. En este
__rendered_path__33
método, se especifican el número destino, el cuerpo del mensaje y el proveedor de
__rendered_path__37
servicios SMS, entre otros. Para indicar el número y mensaje, se obtienen del Intent los
__rendered_path__37
datos asociados. El proveedor de servicios SMS se especifica como null, lo cual
__rendered_path__33
significa que se utilizará el proveedor por defecto asociado a la tarjeta SIM presente en
__rendered_path__37
el dispositivo.
__rendered_path__37
__rendered_path__17
Para comunicar al usuario el resultado de tal operación, se utiliza la clase Dialog del
__rendered_path__21
paquete android.app. Mediante un objeto de esta clase, se advierte al usuario del
__rendered_path__21
éxito del envío o de algún error que haya tenido lugar durante el mismo. Como se puede
__rendered_path__33
comprobar, una vez más se utilizan los recursos textuales declarados en la carpeta
__rendered_path__37
“\res\values”, dentro del fichero “strings.xml”.
__rendered_path__37
__rendered_path__33
No hay que olvidar que para que la clase SMSWriter y el envío del SMS funcionen
__rendered_path__37
correctamente, es necesario hacer antes algunas declaraciones en el fichero del
__rendered_path__37
manifiesto. Por un lado, debe adjuntarse un permiso específico para los mensajes de
__rendered_path__33
texto:
__rendered_path__37
__rendered_path__37
__rendered_path__43
__rendered_path__14__rendered_path__45
<uses-permission android:name="android.permission.SEND_SMS" />
__rendered_path__14__rendered_path__45
__rendered_path__15
__rendered_path__14
Código 59. Declaración en el manifiesto del permiso para enviar SMS
__rendered_path__14
__rendered_path__14
__rendered_path__14
Además, ya que la clase SMSWriter es una Activity, esta debe ser declarada en el
__rendered_path__15
mismo “AndroidManifest.xml” como componente básico de la aplicación que es. La
__rendered_path__14
declaración mostrada en el debe hacerse dentro del elemento <application>.
__rendered_path__14
__rendered_path__16
Jaime Aranaz Tudela
155
__rendered_path__16__rendered_path__37__rendered_path__37__rendered_path__14__rendered_path__14__rendered_path__15__rendered_path__14__rendered_path__14__rendered_path__16__rendered_path__16
Ingeniería en Informática

Page 156
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__14
<activity android:name=".SMSWriter"></activity>
__rendered_path__15
__rendered_path__14
__rendered_path__14
Código 60. Declaración en el manifiesto de la Activity SMSWriter
__rendered_path__16
__rendered_path__16
4.2.18
Actualización periódica en el servidor
__rendered_path__18
__rendered_path__18
Anteriormente se ha explicado cómo la clase HTTPConnection se encarga de los
__rendered_path__14__rendered_path__16
aspectos de más bajo nivel del protocolo HTTP relacionados con las conexiones con el
__rendered_path__11__rendered_path__14__rendered_path__16
servidor; también se ha mencionado que las clases XMLExchange y MyXMLHandler se
__rendered_path__15
utilizan para procesar las peticiones enviadas y las respuestas recibidas en formato
__rendered_path__14
XML. Sin embargo, hasta ahora no se ha mencionado nada con respecto a cómo
__rendered_path__14
ContactMap conecta periódicamente con el servidor utilizando la clase Update.
La clase Update extiende la clase Service que, al igual que Activity, representa uno
de los componentes básicos que pueden construir una aplicación Android. Un Service,
tal y como se ha dicho en anteriores ocasiones, representa una tarea sin interfaz que se
realiza en background sin conocimiento del usuario, y que puede formar parte del
mismo proceso que la aplicación que lo lanza o de otro distinto.
Para actualizar los datos, la clase Update conecta de forma periódica con el servidor,
utilizando la clase HTTPConnection y su método connect(), que se encarga de
enviar al servidor la petición presente en su atributo mDataOut y escribir la respuesta
en su otro atributo mDataIn (ver apartado 4.2.8). Update únicamente llama cada cierto
tiempo a connect(), mientras que la clase ContactMap, también periódicamente, lee
la respuesta recibida y escribe la petición que se ha de enviar en la próxima conexión
que haga Update.
En la Figura 32 se muestra un diagrama de secuencia utilizando el estándar UML 2.0
[35] donde se exponen los pasos seguidos para realizar una conexión con el servidor.
Nótese que la clase ContactMap utiliza las clases XMLExchange y MyXMLHandler
para construir la petición y leer la respuesta, pero para simplificar dicho diagrama se
han omitido esos pasos.
Jaime Aranaz Tudela
156
Ingeniería en Informática

Page 157
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__11Image_892_0
Figura 32. Diagrama de secuencia para las conexiones con el servidor
Lanzar el servicio es tan sencillo como llamar al método startService() de la clase
Activity. Este hecho se produce en el método onCreate() de la clase ContactMap,
justo cuando se ha comprobado que existe una conexión Wi-Fi disponible. El Código 61
muestra cómo se lanza el Service Update.
__rendered_path__39
__rendered_path__39
public class ContactMap extends MapActivity {
__rendered_path__37__rendered_path__40
__rendered_path__39
@Override
__rendered_path__39
public void onCreate(Bundle savedInstanceState) {
__rendered_path__41
__rendered_path__41
// (...)
__rendered_path__42
__rendered_path__49
// Wi-Fi disponible
__rendered_path__49
if (wifiEnabled==true){
__rendered_path__50
__rendered_path__52
// Crear un Intent asociado a la clase Update
__rendered_path__52
Intent UpdateService = new Intent(this, Update.class);
__rendered_path__53
// Lanzar Service
__rendered_path__56
this.startService(UpdateService);
__rendered_path__56
__rendered_path__50
__rendered_path__52
__rendered_path__52
Jaime Aranaz Tudela
157
__rendered_path__50__rendered_path__52__rendered_path__52__rendered_path__53__rendered_path__56__rendered_path__56__rendered_path__50__rendered_path__52__rendered_path__52__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__50__rendered_path__52__rendered_path__52__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__50__rendered_path__52__rendered_path__52__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__42__rendered_path__49__rendered_path__49__rendered_path__37__rendered_path__94__rendered_path__94__rendered_path__95__rendered_path__94__rendered_path__94__rendered_path__41__rendered_path__41
Ingeniería en Informática

Page 158
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__12__rendered_path__14
// Wi-Fi no disponible
__rendered_path__15
}else{
__rendered_path__14
// Lanzar aviso
__rendered_path__14
// Obtener localizaciones desde SQLite
__rendered_path__16
__rendered_path__16
}
__rendered_path__17
// (...)
__rendered_path__20
}
__rendered_path__20
__rendered_path__17
}
__rendered_path__20
__rendered_path__20
Código 61. Lanzar el Service Update
__rendered_path__24
__rendered_path__11__rendered_path__26
__rendered_path__26
Al igual que ocurre cuando se lanza una nueva Activity, para lanzar un Service es
__rendered_path__17
necesario utiliza un objeto de la clase Intent. Este objeto se crea vinculado a la propia
__rendered_path__20
clase Update, que es el componente Service que se desea comenzar. Si existe Wi-Fi
__rendered_path__20
disponible, se lanza el servicio. Si no, se comunica tal situación al usuario y se
__rendered_path__28
actualizan los contactos utilizando la información guardada en la base de datos SQLite
__rendered_path__30
del propio dispositivo móvil (consultar apartados 4.2.7 y 4.2.12).
__rendered_path__30
__rendered_path__28
Generalmente, los elementos Service empleados en una aplicación Android repiten de
__rendered_path__30
forma cíclica una determinada tarea que debe ser simultánea a las otras actividades
__rendered_path__30
llevadas a cabo por la aplicación. Por ello, casi siempre un Service implementa un hilo o
__rendered_path__17
thread donde desarrolla alguna acción. Update lanza un hilo en su método
__rendered_path__20
onCreate(), tal y como se ve en el Código 62, que conecta con el servidor mediante
__rendered_path__20
HTTPConnection y se duerme un cierto tiempo mediante un sleep().
__rendered_path__28
__rendered_path__30
__rendered_path__30
__rendered_path__28
public class Update extends Service{
__rendered_path__30
__rendered_path__30
// dirección del servidor
__rendered_path__12
private String mServer = getResources().getString(R.string.server);
__rendered_path__37__rendered_path__16
// temporizador de conexión
__rendered_path__37__rendered_path__16
private int mTime = getResources().getInteger(R.integer.time_update);
__rendered_path__38
// connexion HTTP
__rendered_path__37
private HTTPConnection mHTTPConnection = new HTTPConnection(mServer);
__rendered_path__37
// hilo que conectará periódicamente
__rendered_path__85__rendered_path__14
public Thread mThread = new Thread(mTask);
__rendered_path__14
__rendered_path__15
@Override
__rendered_path__14
public void onCreate() {
__rendered_path__14
__rendered_path__87
super.onCreate();
__rendered_path__87
mThread.start();
__rendered_path__24
}
__rendered_path__26
__rendered_path__26
__rendered_path__17
__rendered_path__20
__rendered_path__20
__rendered_path__28
Jaime Aranaz Tudela
158
__rendered_path__30__rendered_path__30__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__24__rendered_path__26__rendered_path__26__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__24__rendered_path__26__rendered_path__26__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__17__rendered_path__20__rendered_path__20__rendered_path__28__rendered_path__30__rendered_path__30__rendered_path__12__rendered_path__14__rendered_path__14__rendered_path__15__rendered_path__14__rendered_path__14__rendered_path__16__rendered_path__16
Ingeniería en Informática

Page 159
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__12__rendered_path__14
__rendered_path__15
Runnable mTask = new Runnable() {
__rendered_path__14
public void run(){
__rendered_path__14
__rendered_path__16
while (true){
__rendered_path__16
__rendered_path__17
// Conectar con el servidor
__rendered_path__19
mHTTPConnection.connect();
__rendered_path__19
// Dormir el hilo 10 segundos
__rendered_path__17
Thread.sleep(mTime);
__rendered_path__19
}
__rendered_path__19
}
__rendered_path__25
};
__rendered_path__31
__rendered_path__11__rendered_path__31
}
__rendered_path__17
__rendered_path__19
__rendered_path__19
Código 62. Conexión periódica mediante la clase Update
__rendered_path__33
__rendered_path__39
__rendered_path__39
La clase Update cuenta además con atributo de nombre mService que contiene el
__rendered_path__33
nombre del servidor donde debe conectar ContactMap. Este es el único lugar donde se
__rendered_path__39
hace referencia a tal dirección, ya que en la construcción del objeto HTTPConnection
__rendered_path__39
se pasa como parámetro dicho valor y es el que utiliza el método connect() para
__rendered_path__17
lanzar su conexión HTTP. Para conocer la dirección del servidor, se utiliza el recurso de
__rendered_path__19
texto definido en el archivo “\res\values\strings.xml” de nombre “server”. Mediante los
__rendered_path__19
métodos getResources().getString(), es posible obtener directamente una
__rendered_path__33
cadena de texto del recurso especificado.
__rendered_path__39
__rendered_path__39
Por otro lado, el atributo de mTime representa el intervalo de tiempo que debe esperar
__rendered_path__33
Update entre cada conexión. Este valor, representado en milisegundos, se obtiene
__rendered_path__39
también
de
los
recursos
externos,
pero
en
este
caso
del
fichero
__rendered_path__39
“\res\values\integers.xml”, donde hay un elemento declarado con el nombre
__rendered_path__33
“update_timer”.
__rendered_path__39
__rendered_path__39
4.2.19
Utilización de interfaces remotas mediante AIDL
__rendered_path__17
__rendered_path__19
En el apartado anterior se ha explicado como ContactMap actualiza de forma periódica
__rendered_path__19
su información con la del servidor, utilizando para ello un componente Service
__rendered_path__33
encarnado en la clase Update. Esta clase simplemente lanza el método connect() de
__rendered_path__39
HTTPConnection, que recoge en sus atributos tanto la petición que se ha de enviar
__rendered_path__39
como la respuesta que se recibe. La clase ContactMap es la que debe escribir y leer
__rendered_path__33
esos datos antes y después de la conexión, respectivamente.
__rendered_path__39
__rendered_path__39
Para actuar de forma coordinada, Update debe comunicar a la clase ContactMap
__rendered_path__17
cuándo se va a conectar, para que así pueda preparar la petición que se ha de enviar. Así
__rendered_path__19
mismo, Update también debe anunciar a ContactMap que la conexión ya se ha
__rendered_path__19
Jaime Aranaz Tudela
159
__rendered_path__25__rendered_path__31__rendered_path__31__rendered_path__63__rendered_path__65__rendered_path__65__rendered_path__66__rendered_path__65__rendered_path__65__rendered_path__67__rendered_path__67
Ingeniería en Informática