how to create own download manager in android 2.2

前端 未结 1 540
甜味超标
甜味超标 2020-12-13 11:40

I know that we can use built-in download manager in Android 2.3 and above but my app is suitable for Android 2.2 and above.My question is how to create own download manager

相关标签:
1条回答
  • 2020-12-13 11:58

    please provide me some sample answer.

    Step1 Look for Example on How to Download Files in Android

    Step2 Look for Example on How to perform operations in AsyncTask.

    Step3 Look for Example on How to Display Download Progress while Downloading.

    Step4 Look for Example on How to send Custom Broadcast when Task is completed

    Step5 Look for Example on How to Persist AsysncTask operation even on device rotation

    Step6 Look for Example on How to Show Download Progress in Notification.

    Below is example code.

    1. Use AsyncTask and show the download progress in a dialog

    // 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;
        }
    

    The method above (doInBackground) runs always on a background thread. You shouldn't do any UI tasks there. On the other hand, the onProgressUpdate and onPreExecute run on the UI thread, so there you can change the progress bar:

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

    2. Download from Service

    The big question here is: how do I update my activity from a service?. In the next example we are going to use two classes you may not be aware of: ResultReceiver and IntentService. ResultReceiver is the one that will allow us to update our thread from a service; IntentService is a subclass of Service which spawns a thread to do background work from there (you should know that a Service runs actually in the same thread of your app; when you extends Service, you must manually spawn new threads to run CPU blocking operations).

    Download service can look like this:

    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);
        }
    }
    

    Add the service to your manifest:

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

    And the activity will look like this:

    // initialize the progress dialog like in the first example

    // this is how you fire the downloader

    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);
    

    Here is were ResultReceiver comes to play:

    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();
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题