Cómo crear su propio gestor de descargas en android 2.2

Sé que podemos utilizar built-in gestor de descargas en Android 2.3 y superior, pero mi aplicación es adecuada para Android 2.2 y superior.Mi pregunta es cómo crear su propio gestor de descarga en Android 2.2? Por favor, proporcione una respuesta de muestra.

Por favor, proporcione una respuesta de muestra.

Paso 1 Busca ejemplos sobre cómo descargar archivos en Android

Paso 2 Busque un ejemplo sobre cómo realizar operaciones en AsyncTask.

Paso 3 Busque ejemplos sobre cómo mostrar el progreso de la descarga durante la descarga.

Paso 4 Busque un ejemplo sobre cómo enviar una difusión personalizada cuando se completa la tarea

Paso 5 Busque un ejemplo sobre cómo persistir la operación AsysncTask incluso en la rotación del dispositivo

Paso 6 Busque un ejemplo sobre cómo mostrar el progreso de la descarga en la notificación.

A continuación se muestra el código de ejemplo.

1. Utilice AsyncTask y muestre el progreso de la descarga en un diálogo

// declare the dialog as a member field of your activity ProgressDialog mProgressDialog; // instantiate it within the onCreate method mProgressDialog = new ProgressDialog(YourActivity.this); mProgressDialog.setMessage("A message"); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // execute this when the downloader must be fired DownloadFile downloadFile = new DownloadFile(); downloadFile.execute("the url to the file you want to download"); The AsyncTask will look like this: // usually, subclasses of AsyncTask are declared inside the activity class. // that way, you can easily modify the UI thread from here private class DownloadFile extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String... sUrl) { try { URL url = new URL(sUrl[0]); URLConnection connection = url.openConnection(); connection.connect(); // this will be useful so that you can show a typical 0-100% progress bar int fileLength = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream("/sdcard/file_name.extension"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; // publishing the progress.... publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { } return null; } 

El método anterior (doInBackground) se ejecuta siempre en un subproceso de fondo. Usted no debe hacer ninguna tarea de IU allí. Por otro lado, onProgressUpdate y onPreExecute se ejecutan en el subproceso de interfaz de usuario, por lo que puede cambiar la barra de progreso:

  @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog.show(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); mProgressDialog.setProgress(progress[0]); } } 

2. Descargar desde el servicio

La gran pregunta aquí es: ¿cómo puedo actualizar mi actividad de un servicio ?. En el siguiente ejemplo vamos a usar dos clases que puede que no conozcas: ResultReceiver e IntentService. ResultReceiver es el que nos permitirá actualizar nuestro hilo de un servicio; IntentService es una subclase de Service que genera un hilo para hacer el trabajo de fondo desde allí (debe saber que un servicio se ejecuta realmente en el mismo hilo de la aplicación, cuando se extiende el servicio, debe generar nuevos hilos para ejecutar las operaciones de bloqueo de CPU) .

El servicio de descarga puede verse así:

 public class DownloadService extends IntentService { public static final int UPDATE_PROGRESS = 8344; public DownloadService() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { String urlToDownload = intent.getStringExtra("url"); ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); try { URL url = new URL(urlToDownload); URLConnection connection = url.openConnection(); connection.connect(); // this will be useful so that you can show a typical 0-100% progress bar int fileLength = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk"); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress" ,(int) (total * 100 / fileLength)); receiver.send(UPDATE_PROGRESS, resultData); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (IOException e) { e.printStackTrace(); } Bundle resultData = new Bundle(); resultData.putInt("progress" ,100); receiver.send(UPDATE_PROGRESS, resultData); } } 

Agregue el servicio a su manifiesto:

 <service android:name=".DownloadService"/> 

Y la actividad se verá así:

// inicializa el diálogo de progreso como en el primer ejemplo

// Así es como disparas el descargador

 mProgressDialog.show(); Intent intent = new Intent(this, DownloadService.class); intent.putExtra("url", "url of the file to download"); intent.putExtra("receiver", new DownloadReceiver(new Handler())); startService(intent); 

Aquí es donde ResultReceiver viene a jugar:

 private class DownloadReceiver extends ResultReceiver{ public DownloadReceiver(Handler handler) { super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultCode == DownloadService.UPDATE_PROGRESS) { int progress = resultData.getInt("progress"); mProgressDialog.setProgress(progress); if (progress == 100) { mProgressDialog.dismiss(); } } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.