美文网首页
DownloadService

DownloadService

作者: 熊大哥87 | 来源:发表于2017-07-22 09:12 被阅读0次

    DownloadTask下载任务

    public class DownloadTask extends AsyncTask<String,Integer,Integer> {
        public static final int TYPE_SUCCESS=0;//成功
        public static final int TYPE_FAILED=1;//失败
        public static final int TYPE_PAUSED=2;//暂停
        public static final int TYPE_CANCELED=3;//取消
        private DownloadListener listener;//下载监听器
        private boolean isCanceled=false;//是否取消
        private boolean isPaused=false;//是否暂停
        private int lastprogress;//下载进度
        public DownloadTask(DownloadListener listener){//构造方法传入一个监听器
            this.listener=listener;
        }
        @Override
        protected Integer doInBackground(String... strings) {//后台计算,所有耗时操作
            InputStream is = null;
            RandomAccessFile saveFile = null;
            FileOutputStream output;
            File file = null;
            try {
                long downloadLength = 0;
                String dolwnloadUrl = strings[0];
                String filename = dolwnloadUrl.substring(dolwnloadUrl.lastIndexOf("/"));//切出下载文件名
                String directroy = "/mnt/sdcard/Download";//规定下载路径
                file = new File(directroy + filename);
                URL url = new URL(dolwnloadUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();//
                connection.setRequestMethod("GET");
                connection.setReadTimeout(5000);
                connection.setConnectTimeout(5000);
                connection.setDoInput(true);
                connection.setDoOutput(true);
                long contentlength = getContentLength(dolwnloadUrl);//获取下载内容长度
                if (contentlength == 0) {
                    return TYPE_FAILED;
                } else if (contentlength == downloadLength) {
                    return TYPE_SUCCESS;
                }
                if (file.exists()){
                    downloadLength=file.length();//读取下载长度
                }
                saveFile = new RandomAccessFile(file, "rw");//开启流
                connection.setRequestProperty("RANGE", "bytes=" + downloadLength + "-");
                is = connection.getInputStream();
                saveFile.seek(downloadLength);
                byte[] b = new byte[1024];
                int count = 0;
                int len = -1;
                while ((len = is.read(b)) != -1) {
                    if (isCanceled) {
                        return TYPE_CANCELED;
                    } else if (isPaused) {
                        return TYPE_PAUSED;
                    } else {
                        saveFile.write(b, 0, len);
                        count += len;
                        int prpgress = (int) (((count + downloadLength) / (float) contentlength) * 100);//计算进度条
                        publishProgress(prpgress);//更新进度条
                    }
                }
                return TYPE_SUCCESS;
                } catch(Exception e){
                    e.printStackTrace();
                }finally{
                    try {
                        if (is != null) {
                            is.close();
                        }
                        if (saveFile != null) {
                            saveFile.close();
                        }
                        if (isCanceled && file != null) {
                            file.delete();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return TYPE_FAILED;
            }
        @Override
        protected void onPostExecute(Integer integer) {执行完成后调用收尾工作
            switch (integer){
                case TYPE_SUCCESS:
                    listener.onSuccess();
                    break;
                case TYPE_FAILED:
                    listener.onFailed();
                    break;
                case TYPE_PAUSED:
                    listener.onPause();
                    break;
                case TYPE_CANCELED:
                    listener.onCanceled();
                    break;
                default:break;
    
            }
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
            int progress=values[0];
            if (progress>lastprogress){
                listener.onProgress(progress);
                lastprogress=progress;
            }
        }
        public void pauseDowndload(){
            isPaused=true;
        }
        public void canceDowndload(){
            isCanceled=true;
        }
        private long getContentLength(String dolwnloadUrl) {
            try {
                URL url=new URL(dolwnloadUrl);
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                long contentlength=connection.getContentLength();
                return contentlength;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    }
    
    

    DownloadService

    public class DownloadService extends Service {
        private DownloadTask downloadTask;//下载任务
        private String downloadUrl;//下载地址
        private DownloadBinder mdownloadBinder=new DownloadBinder();
        private DownloadListener listener=new DownloadListener() {
            @Override
            public void onProgress(int progress) {
                getNotiFicationManager().notify(1,getNotification("Download...",progress));
            }
    
            @Override
            public void onSuccess() {
                downloadTask=null;
                stopForeground(true);
                getNotiFicationManager().notify(1,getNotification("Download Sucess",-1));
                Toast.makeText(DownloadService.this,"Download Success",Toast.LENGTH_LONG).show();
            }
            @Override
            public void onFailed() {
                downloadTask=null;
                stopForeground(true);
                getNotiFicationManager().notify(1,getNotification("Download Failed",-1));
                Toast.makeText(DownloadService.this,"Download Failed",Toast.LENGTH_LONG).show();
            }
    
            @Override
            public void onPause() {
                downloadTask=null;
                Toast.makeText(DownloadService.this,"Download Paused",Toast.LENGTH_LONG).show();
            }
    
            @Override
            public void onCanceled() {
                downloadTask=null;
                stopForeground(true);
                Toast.makeText(DownloadService.this,"Download Cancled",Toast.LENGTH_LONG).show();
            }
        };
    
        class DownloadBinder extends Binder{
            public void startDownload(String url){
                if (downloadTask==null){
                    downloadUrl=url;
                    downloadTask=new DownloadTask(listener);
                    downloadTask.execute(downloadUrl);
                    startForeground(1,getNotification("Dowloading...",0));
                    Toast.makeText(DownloadService.this,"Downloading...",Toast.LENGTH_LONG).show();
                }
            }
            public void pauseDownload(){
                if (downloadTask!=null){
                    downloadTask.pauseDowndload();
                }
            }
            public void cancelDownload(){
                if (downloadTask!=null){
                    downloadTask.canceDowndload();
                }else {
                    if (downloadUrl!=null){
                        String filename=downloadUrl.substring(downloadUrl.lastIndexOf("/"));
                        String diectroy="/mnt/sdcard/Download";
                        File file=new File(diectroy+filename);
                        if(file.exists()){
                            file.delete();
                        }
                        getNotiFicationManager().cancel(1);
                        stopForeground(true);
                        Toast.makeText(DownloadService.this,"Download Cancled",Toast.LENGTH_LONG).show();
                    }
                }
    
            }
    
        }
    
        private NotificationManager getNotiFicationManager() {
            return (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        }
        private Notification getNotification(String title,int progress){
            Intent intent=new Intent(this,MainActivity.class);
            PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
            NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
            builder.setContentIntent(pi);
            builder.setContentTitle(title);
            if (progress>0){
                builder.setContentText(progress+"%");
                builder.setProgress(100,progress,false);
            }
            return builder.build();
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
    
            return mdownloadBinder;
        }
    }
    

    DownloadListener

    public interface DownloadListener {
        void onProgress(int progress);//下载进度
        void onSuccess();//下载成功
        void onFailed();//下载失败
        void onPause();;//下载暂时
        void onCanceled();//下载关闭
    }
    

    Activity

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button mBtnstartD,mBtnpauseD,mBtncancleD;
        private DownloadService.DownloadBinder downloadBinder;
        private EditText mEdtdownload;
        private ServiceConnection  connection=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                downloadBinder=(DownloadService.DownloadBinder)iBinder;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
    
            }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mBtnstartD=(Button)findViewById(R.id.start_download);
            mBtnpauseD=(Button)findViewById(R.id.pause_download);
            mBtncancleD=(Button)findViewById(R.id.cancel_download);
            mBtnstartD.setOnClickListener(this);
            mBtnpauseD.setOnClickListener(this);
            mBtncancleD.setOnClickListener(this);
            mEdtdownload=(EditText)findViewById(R.id.download);
            Intent intent=new Intent(this,DownloadService.class);
            startService(intent);
            bindService(intent,connection,BIND_AUTO_CREATE);
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }
        }
    
        @Override
        public void onClick(View view) {
            if (downloadBinder==null){
                Toast.makeText(MainActivity.this,"哈哈",Toast.LENGTH_LONG).show();
                return;
            }
            switch (view.getId()){
                case R.id.start_download:
                    String url=mEdtdownload.getText().toString().trim();
                    downloadBinder.startDownload(url);
                    break;
                case R.id.pause_download:
                    downloadBinder.pauseDownload();
                    break;
                case R.id.cancel_download:
                    downloadBinder.cancelDownload();
                    break;
                default:break;
            }
    
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode){
                case 1:if (grantResults.length>0&&grantResults[0]!=PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this,"拒绝将无法使用",Toast.LENGTH_LONG).show();
                    finish();
                }
                break;
                default:break;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unbindService(connection);
        }
    

    相关文章

      网友评论

          本文标题:DownloadService

          本文链接:https://www.haomeiwen.com/subject/emwykxtx.html