1. Android SD存储相关
1) 检查SD状态
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(MainActivity.this, "无法操作SD卡", Toast.LENGTH_LONG).show(); return true; }
2) 获取SD下载目录
String downloadDirPath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
2. DownloadManager
1) 配置权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2) 获取实例
DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
3) 通过DownloadManager.Request设置下载请求信息
//downloadUrl为下载地址 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl)); //设置文件下载目录和文件名 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "test.apk"); //设置下载中通知栏提示的标题 request.setTitle("test apk"); //设置下载中通知栏提示的介绍 request.setDescription("测试下载中"); /* 表示下载进行中和下载完成的通知栏是否显示,默认只显示下载中通知, VISIBILITY_HIDDEN表示不显示任何通知栏提示, 这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION */ //request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); /* 表示下载允许的网络类型,默认在任何网络下都允许下载, 有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三种及其组合可供选择; 如果只允许wifi下载,而当前网络为3g,则下载会等待 */ //request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); //移动网络情况下是否允许漫游 //request.setAllowedOverRoaming(true); //表示允许MediaScanner扫描到这个文件,默认不允许 //request.allowScanningByMediaScanner(); /* 设置下载文件的mineType, 因为下载管理Ui中点击某个已下载完成文件及下载完成点击通知栏提示都会根据mimeType去打开文件, 所以我们可以利用这个属性。比如上面设置了mimeType为application/package.name, 我们可以同时设置某个Activity的intent-filter为application/package.name,用于响应点击的打开文件 */ //request.setMimeType("application/package.name"); //添加请求下载的网络链接的http头,比如User-Agent,gzip压缩等 //request.addRequestHeader(String header, String value);
4) 发起下载请求
/* 调用downloadManager的enqueue接口进行下载, 返回唯一的downloadId用于下载状态查询和下载完成监听 */ long downloadId = downloadManager.enqueue(request);
3. 查询下载状态
DownloadManager.Query用来查询下载信息
//setFilterById根据下载id进行过滤 DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId); Cursor cursor = null; try { cursor = downloadManager.query(query); if (cursor != null && cursor.moveToFirst()) { downloadedBytes = cursor.getLong(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); totalBytes = cursor.getLong(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); status = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); } } finally { if (cursor != null) { cursor.close(); } }
4. 连续性地更新下载进度
1) 方法一:注册ContentObserver,监听下载状态,每次变化都会触发onChange
private ContentObserver downloadObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); //TODO //此处可以通知handle去查询下载状态 } }; @Override protected void onResume() { super.onResume(); //注册ContentObserver getContentResolver().registerContentObserver( Uri.parse("content://downloads/my_downloads"), true, downloadObserver); } @Override protected void onPause() { super.onPause(); getContentResolver().unregisterContentObserver(downloadObserver); }
2) 方法二:通过ScheduledExecutorService轮询
a) ScheduledExecutorService相关
① 接口scheduleAtFixedRate原型定义及参数说明
/* command:执行线程 initialDelay:初始化延时 period:两次开始执行最小间隔时间 unit:计时单位 */ public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
注:If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor. If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.
即当执行任务的时间大于我们指定的间隔时间时,它并不会在指定间隔时开辟一个新的线程并发执行这个任务,而是等待该线程执行完毕。
②关于任务的取消和重用
//get reference to the future Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) //cancel instead of shutdown future.cancel(true); //schedule again (reuse) future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) //shutdown when you don't need to reuse the service anymore service.shutdown()
b) 具体实现
ScheduledExecutorService scheduledExecutorService; Future<?> future; //下载的文件存储名 String downloadFilePath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + "/test.apk"; File downFile = new File(downloadFilePath); long fileTotalSize; //每过100ms通知handler去查询下载状态 future = scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { Message msg = mHandler.obtainMessage(); msg.what = QUERY; mHandler.sendMessage(msg); } }, 0, 100, TimeUnit.MILLISECONDS); private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case QUERY: Cursor cursor = downloadManager.query(query); if (cursor != null && cursor.moveToFirst()) { //此处直接查询文件大小 long downSize = downFile.length(); //获取文件下载总大小 fileTotalSize = cursor.getLong(cursor.getColumnIndex( DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); cursor.close(); Log.w(TAG, "downloaded size: " + downSize); Log.w(TAG, "total size: " + fileTotalSize); if (fileTotalSize != 0) { int percentage = (int) (downSize * 100 / fileTotalSize); statusBar.setProgress(percentage); statusText.setText(percentage + "%"); } //终止轮询task if (fileTotalSize == downSize) future.cancel(true); } } return true; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); scheduledExecutorService = Executors.newScheduledThreadPool(1); } @Override protected void onDestroy() { super.onDestroy(); if (future != null && !future.isCancelled()) future.cancel(true); if (scheduledExecutorService != null && !scheduledExecutorService.isShutdown()) scheduledExecutorService.shutdown(); }
5. 获取DownloadManager下载完成的推送信息
下载完成后,DownloadManager会发出DownloadManager.ACTION_DOWNLOAD_COMPLETE这个广播,并传递downloadId作为参数。通过接受广播我们可以打开对下载完成的内容进行操作。
BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (completeDownloadId == downloadId) { Log.w(TAG, "download complete"); statusBar.setProgress(100); statusText.setText("100%"); } } }; @Override protected void onResume() { super.onResume(); /** 注册下载完成接收广播 **/ registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(downloadCompleteReceiver); }
6. Refer:
Android系统下载管理DownloadManager功能介绍及使用示例
ScheduledExecutorService start stop several times
相关推荐
本篇文章主要介绍了android中DownloadManager实现版本更新,监听下载进度实例。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
Android DownLoadManager使用的小例子,主要使用DownloadManager.Request方法来下载文件,下载可在通知栏中显示
使用DownloadManager 下载完 apk 自动提示安装的功能
但是从现在开始,使用优秀的应用程序将变得更加舒适 – Advanced Download Manager 来自才华横溢的开发人员 AdvancedApp。 安卓 ADM 下载器 Advanced Download Manager 中文版安卓 ADM 下载器 Advanced Download ...
利用DownloadManager下载,添加进度显示功能,下载apk完成后跳转安装,可以用于app自动更新的下载安装
开发过程常常会用到下载apk,进行升级安装。如果自己写asynctask异步下载、安装,如果下载过程退出app,线程会在后台下载,但是下载的进度如何处理,下载完成后,怎么安装呢?可以使用DownloadManager解决这些问题。
Advanced Download Manager是最适合您的Android下载器! 强大的下载器: - 从互联网上下载最多三个文件; - 使用多线程加速下载(9个部分) - 在后台下载文件并在失败后恢复; - 拦截浏览器和剪贴板中的链接; - ...
异步下载文件库,使用service开启线程下载并在界面中使用progressbar...其实GB之后DownloadManager已经很完善的实现了下载功能.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android自带的DownloadManager的使用,十分的好用方便。
–通过使用多线程(9个部分)加快下载速度 –拦截来自Android浏览器和剪贴板的链接; -在失败后的背景和简历下载文件; –图像,文件,档案和程序的加载器; –下载棒棒糖和棉花糖的SD卡; –加快下载速度的智能...
Android 使用 DowanloadManager 实现下载并获取下载进度实例代码 实现代码: package com.koolsee.gallery; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util....
通过开源看DownloadManager多线程来下载网络资源,可自定义下载路径,同时通过notification通知栏的控制来展示下载进度,下载完成之后自动安装apk
原生DownloadManager实现版本的检测更新,可采取静默模式,非静默模式(进度框),是否强制更新、是否MD5校验、完美适配Android M/N/O/P/Q 功能介绍 兼容AndroidX,项目已经迁移到Androidx 适配Android M,处理关于...
下载管理器 基于Java的下载管理器源代码 下载管理器使用由Java的Swing库构建的简单而有效的GUI界面。 Swing的使用为界面带来了清晰,现代的... DownloadManager.java Download Manager类负责GUI界面,并利用Download
1dialogButtonTextColor对话框按钮的文字颜色-1所有版本:点击查看使用步骤第一步: app/build.gradle进行依赖implementation 'com.azhon:appupdate:1.7.3'第二步:创建DownloadManager,更多用法请查看这里示例...
Android平台面向开发者提供了DownloadManager这个服务(service),可以用来完成下载,同时异步地得到下载进度的实时更新提示。 原生的浏览器,Android Market以及GMail等客户端都使用了该接口。 该接口也部分的提供...
Android系统下载管理DownloadManager增强方法,可用于包括获取下载相关信息,如: getStatusById(long) 得到下载状态 getDownloadBytes(long) 得到下载进度信息 getBytesAndStatus(long) 得到下载进度信息和状态 ...
本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下 下载管理器 关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3....
downloadManager中文支持断点续传,你只需要传入一个url就可以在下载过程中返回一个下载进度,下载完之后,返回一个下载路径,如果失败也会返回一个错误调用方法- (void)downloadWithURL:(NSURL *)url progress:...