Tutorial Android - Actualizar datos solamente por WiFi
En el desarrollo de las aplicaciones móviles, uno de los recursos que más solemos utilizar es descargar y actualizar datos de nuestros servidores. Esto comúnmente implica un tráfico bastante elevado de datos en la mayoría de ocasiones, aunque sólo se trate de texto plano.
Una buena práctica a la hora de implementar esta funcionalidad, es dar la opción al usuario a elegir cuándo actualizar esta información. En general, se suele ofrecer la posibilidad de solamente conectarse mediante redes WIFI, evitando de esta manera un consumo de datos elevado en nuestra tarifa móvil.
Lo más común, y lo más recomendado al mismo tiempo, es que sea un Service el que se encargue de actualizar/descargar dicha información. En nuestro caso lo llamaremos DataUploaderService. En este tutorial obviaremos la lógica de dicho servicio, puesto que nos vamos a enfocar en solamente implementar la comunicación por WiFi.
Para lanzar o no nuestro servicio en función del estado de la conexión, crearemos una clase que llamaremos NetWatcher. La cual extenderemos de BroadcastReceiver e implementamos nuestro código dentro del método onReceive.
/** * Enables or disables the synchronization of the data * * @author Miguel Catalan Bañuls */ public class NetWatcher extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (shouldUpload()) { //Start service Intent intent_start = new Intent(context, DataUploaderService.class); context.startService(intent_start); } else { //Stop service Intent intent_stop = new Intent(context, DataUploaderService.class); context.stopService(intent_stop); } } /** * Evaluates the possibility to upload the data based on user and network state * * @return order to upload or not */ private boolean shouldUpload() { boolean multiPass = false; if (isDataWaiting()) { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { //Check if we can only upload con wifi networks if (shouldUploadOnlyByWifi()) { //Check if connection is Wifi if (info.getType() == ConnectivityManager.TYPE_WIFI) { multiPass = true; } } else { multiPass = true; } } } return multiPass; } }Nota: el método isDataWaiting() simplemente devuelve un boolean en función de si tenemos información para actualizar. También shouldUploadOnlyByWifi() nos devuelve un boolean con la elección del usuario.
Esta clase va a "escuchar" los cambios en el estado de la red y para ello tendremos que añadir un par de cosas en nuestro Manifest.
Lo primero es añadir el permiso que nos hace falta para esta funcionalidad:
<!-- Required to check the network status: WIFI VS Mobile Network --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
A continuación, tendremos que decirle a nuestra aplicación que cada vez que se produzca un cambio en el estado de la conexión, ejecute nuestra clase NetWatcher para que evalúe si debemos actualizar la información o no.
<receiver android:name=".NetWatcher"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
Y con este método así de simple y de sencillo tendremos implementada nuestra subida y bajada de datos mediante conexiones WiFi.
¿Os ha parecido útil e interesante? ¿Tenéis dudas? Pues no tengáis miedo de decirlo en los comentarios.