Servicios en Android
Uso de servicios
Servicios en Android (Servicios)
Descripción general de los servicios
Servicios en Android:
Un servicio en segundo plano:
La diferencia entre IntentService y Service
Service versus IntentService
Introducción a los servicios (ejemplo: Un servicio en segundo plano)
Ejemplo: Crear un servicio para reproducir música
Código del Servicio Reproductor de Música
Ejemplo: Crear un servicio para descargar un fichero en segundo plano
build.gradle:
dependencies { implementation("com.squareup.okhttp3:okhttp:4.9.0") }
permisos en el manifiesto:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission-sdk-23 android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Comprobar permisos:
private boolean comprobarPermiso() { //https://developer.android.com/training/permissions/requesting?hl=es-419 String permiso = Manifest.permission.WRITE_EXTERNAL_STORAGE; // Manifest.permission.INTERNET boolean concedido = false; // comprobar los permisos if (ActivityCompat.checkSelfPermission(this, permiso) != PackageManager.PERMISSION_GRANTED) { // pedir los permisos necesarios, porque no están concedidos if (ActivityCompat.shouldShowRequestPermissionRationale(this, permiso)) { concedido = false; } else { ActivityCompat.requestPermissions(this, new String[]{permiso}, REQUEST_CONNECT); // Cuando se cierre el cuadro de diálogo se ejecutará onRequestPermissionsResult } } else { concedido = true; } return concedido; } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { String permiso = Manifest.permission.WRITE_EXTERNAL_STORAGE; //Manifest.permission.INTERNET; // chequeo los permisos de nuevo if (requestCode == REQUEST_CONNECT) if (ActivityCompat.checkSelfPermission(this, permiso) == PackageManager.PERMISSION_GRANTED) // permiso concedido startService(new Intent(MainActivity.this, DownloadService.class)); else // no hay permiso mostrarError("No se ha concedido permiso para conectarse a Internet"); } private void mostrarError(String mensaje) { Toast.makeText(this, mensaje, Toast.LENGTH_SHORT).show(); } }
Descarga del archivo
Escribir en memoria externa el fichero descargado
DownloadService.java
public class DownloadService extends Service { public static final String WEB = "https://dam.org.es/fichero/frases.html"; public DownloadService() { } @Override public void onCreate() { super.onCreate(); mostrarMensaje("Creando el servicio . . ."); } @Override public int onStartCommand(Intent intent, int flags, int startId) { URL url = null; try { url = new URL(WEB); descargaOkHTTP(url); } catch (MalformedURLException e) { e.printStackTrace(); mostrarMensaje("Error en la URL: " + WEB); } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); mostrarMensaje("Servicio destruido"); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } private void descargaOkHTTP(URL web) { final OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(web) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Log.e("Error: ", e.getMessage()); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException{ try (ResponseBody responseBody = response.body()) { if (!response.isSuccessful()) { //throw new IOException("Unexpected code " + response); Log.e("Error: ", "Unexpected code " + response); } else { // Read data on the worker thread final String responseData = response.body().string(); // guardar el fichero descargado en memoria externa if (escribirExterna(responseData)) { Log.i("Descarga: ", "fichero descargado"); } else Log.e("Error ", "no se ha podido descargar"); } } } }); } private void mostrarMensaje(String mensaje) { Toast.makeText(this,mensaje, Toast.LENGTH_SHORT).show(); } private boolean escribirExterna(String cadena) { File miFichero, tarjeta; BufferedWriter bw = null; boolean correcto = false; try { tarjeta = Environment.getExternalStorageDirectory(); miFichero = new File(tarjeta.getAbsolutePath(), "frases.html"); bw = new BufferedWriter(new FileWriter(miFichero)); bw.write(cadena); Log.i("Información: ", miFichero.getAbsolutePath()); } catch (IOException e) { if (cadena != null) Log.e("Error: ", cadena); Log.e("Error de E/S", e.getMessage()); } finally { try { if (bw != null) { bw.close(); correcto = true; } } catch (IOException e) { Log.e("Error al cerrar", e.getMessage()); } } return correcto; } }
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.