Android開發中實現下載文件通知欄顯示進度條

Android開發中實現下載文件通知欄顯示進度條。

1、使用AsyncTask異步任務實現,調用publishProgress()方法刷新進度來實現(已優化)

public class MyAsyncTask extends AsyncTask {

    private Context context;
    private NotificationManager notificationManager;
    private NotificationCompat.Builder builder;

    public MyAsyncTask(Context context){
        this.context = context;
        notificationManager = (NotificationManager) context.getSystemService(Activity.NOTIFICATION_SERVICE);
        builder = new NotificationCompat.Builder(context);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        builder.setSmallIcon(R.mipmap.ic_launcher)
                .setContentInfo("下載中...")
                .setContentTitle("正在下載");

    }

    @Override
    protected Integer doInBackground(String... params) {
        Log.e(TAG, "doInBackground: "+params[0] );
        InputStream is = null;
        OutputStream os = null;
        HttpURLConnection connection = null;
        int total_length = 0;
        try {
            URL url1 = new URL(params[0]);
            connection = (HttpURLConnection) url1.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(50000);
            connection.connect();

            if(connection.getResponseCode() == 200){
                is = connection.getInputStream();
                os = new FileOutputStream("/sdcard/zongzhi.apk");
                byte [] buf = new byte[1024];
                int len;
                int pro1=0;
                int pro2=0;
                // 獲取文件流大小,用於更新進度
                long file_length = connection.getContentLength();
                while((len = is.read(buf))!=-1){
                    total_length += len;
                    if(file_length>0) {
                        pro1 = (int) ((total_length / (float) file_length) * 100);//傳遞進度(註意順序)
                    }
                    if(pro1!=pro2) {
                        // 調用update函數,更新進度
                        publishProgress(pro2=pro1);
                    }
                    os.write(buf, 0, len);
                }
            }


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (connection != null) {
                connection.disconnect();
            }
        }


        return total_length;
    }

    @Override
    protected void onCancelled(Integer integer) {
        super.onCancelled(integer);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        builder.setProgress(100,values[0],false);
        notificationManager.notify(0x3,builder.build());
        //下載進度提示
        builder.setContentText("下載"+values[0]+"%");
        if(values[0]==100) {    //下載完成後點擊安裝
            Intent it = new Intent(Intent.ACTION_VIEW);
            it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            it.setDataAndType(Uri.parse("file:///sdcard/zongzhi.apk"), "application/vnd.android.package-archive");
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, it, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentTitle("下載完成")
                    .setContentText("點擊安裝")
                    .setContentInfo("下載完成")
                    .setContentIntent(pendingIntent);
            notificationManager.notify(0x3, builder.build());
        }
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        if(integer == 100) {
            Toast.makeText(context, "下載完成", Toast.LENGTH_SHORT).show();
        }
    }
}

2、使用系統服務來實現(不是特別推薦此方法)

//取得系統的下載服務
        DownloadManager downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        //創建下載請求對象
        DownloadManager.Request request=new DownloadManager.Request(Uri.parse(downUrl));
        request.setDestinationInExternalPublicDir("目錄","文件名");
        request.setNotificationVisibility(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        downloadManager.enqueue(request);

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *