zoukankan      html  css  js  c++  java
  • android网络编程之HttpUrlConnection的讲解--DownLoadManager基本用法

    1、DownLoadManager是Android用系统服务(Service)的方式来优化处理长时间的下载操作的一个工具类。避免了我们去处理多线程,通知栏等等。

    2、不要忘记添加权限

     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    3、

    public class MainActivity extends Activity {
        private DownloadManager downloadManager;
        
        private long downloadId;
        
        private TextView mTvMsg;
        
        private String downId;
        private String title;
        private String address;
        private String size;
        private String sizeTotal;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            initView();
            initData();
        }
        
        private void initView(){
            mTvMsg = (TextView) findViewById(R.id.tv_msg);
        }
        
        private void initData(){
            downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
            String apkUrl = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk";
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));
            
            // 设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo.apk
            request.setDestinationInExternalPublicDir("aaaa", "MeiLiShuo.apk");
            
            // 表示允许MediaScanner扫描到这个文件,默认不允许
            request.allowScanningByMediaScanner();
            
            // 设置下载中通知栏提示的标题
            request.setTitle("MeiLiShuo");
            
            // 设置下载中通知栏提示的介绍
            request.setDescription("美丽说");
            
            // 默认只显示下载中通知。VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载完成后显示通知栏提示。VISIBILITY_HIDDEN表示不显示任何通知栏提示,
            // 这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            
            // 设置下载文件的mineType。因为下载管理Ui中点击某个已下载完成文件及下载完成点击通知栏提示都会根据mimeType去打开文件,
            // 所以我们可以利用这个属性用于响应点击的打开文件
            request.setMimeType("application/cn.trinea.download.file");
            
            // 添加请求下载的网络链接的http头,比如User-Agent,gzip压缩等
            // request.addRequestHeader(String header, String value)
            
            downloadId = downloadManager.enqueue(request);
            
            new Thread(thread).start();
        }
    
        /** 查询下载任务信息*/
        private void queryDownTask(DownloadManager downManager,long id) {
            DownloadManager.Query query = new DownloadManager.Query();
            query.setFilterById(id);
            Cursor cursor= downManager.query(query);
     
            while(cursor.moveToNext()){
                downId= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_ID));
                title = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE));
                address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                //String statuss = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                size= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                sizeTotal = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
            }
            cursor.close();
        }
        
        private Thread thread = new Thread(){
            public void run() {
                while (true) {
                    queryDownTask(downloadManager, downloadId);
                    
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                    handler.sendEmptyMessage(0);
                }
            };
        };
        
        private Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                if(msg.what == 0){
                    mTvMsg.setText(downId + "
    " + title + "
    " + address + "
    " + size + "
    " + sizeTotal);
                }
            };
        };
    }

    4、下载成功后系统会发出广播DownloadManager.ACTION_DOWNLOAD_COMPLETE,并传递并传递downloadId作为参数。我们可以监听广播来进行下载后的操作。

    <!-- 注册系统静态广播接收器 -->  
            <receiver android:name=".DownloadReceive">  
                <intent-filter>  
                    <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
                </intent-filter>  
            </receiver>
    public class DownloadReceive extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
            
            Toast.makeText(context, reference + "", Toast.LENGTH_SHORT).show();
        }
    
    }

    5、有了通知栏其实下载进度可以不用监听的,不过我们还是可以通过DownManager.Query和Cursor查询下载信息。

    6、参考博文:http://www.open-open.com/lib/view/open1428024407365.html

  • 相关阅读:
    点击子窗体给父窗体上的对象赋值
    框架使用及规范参考
    像Google日历一样的日程管理
    TreeView 和 Menu 的用法
    甘特图-svg版 支持客户端事件
    js获取DropDownList的选择项
    GridView,Repeater分页控件:WebPager(开源)
    TextBox 禁止客户端输入 前台通过JS赋值 并在后台获取
    对象实体 参考标准
    以编程方式控制ScriptManager
  • 原文地址:https://www.cnblogs.com/begin1949/p/5060984.html
Copyright © 2011-2022 走看看