Android开发之自带下载器DownloadManager的使用示例代码
程序员文章站
2023-12-14 12:22:52
android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新app的情形。其基本思路是根据本地的app版本号和服务器的版本号进行比较,如果服务器版本较新,再进行...
android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新app的情形。其基本思路是根据本地的app版本号和服务器的版本号进行比较,如果服务器版本较新,再进行提示然后下载apk最后进行安装。这种需求解决方案有很多,第三方的网络框架基本都有这个功能。
android自带的downloadmanager是一个很好的下载文件的工具。该类在api level 9之后出现,它已经帮我们处理了下载失败、重新下载等功能,整个下载过程全部交给系统负责,不需要我们过多的处理,非常的nice。关键的是用起来也很简单,很爽,稍微封装一下就可以几句话搞定下载。
下面以一个简单案例来实现从服务器下载一个apk文件并进行安装。
1、打开本地tomcat服务器,放入一个apk文件
2、开启tomcat,然后确保能从浏览器下载
3、编写downloadmanager工具类,代码注释很详细
public class downloadutils { //下载器 private downloadmanager downloadmanager; //上下文 private context mcontext; //下载的id private long downloadid; public downloadutils(context context){ this.mcontext = context; } //下载apk public void downloadapk(string url, string name) { //创建下载任务 request request = new request(uri.parse(url)); //移动网络情况下是否允许漫游 request.setallowedoverroaming(false); //在通知栏中显示,默认就是显示的 request.setnotificationvisibility(downloadmanager.request.visibility_visible); request.settitle("新版本apk"); request.setdescription("apk downloading"); request.setvisibleindownloadsui(true); //设置下载的路径 request.setdestinationinexternalpublicdir(environment.getexternalstoragedirectory().getabsolutepath() , name); //获取downloadmanager downloadmanager = (downloadmanager) mcontext.getsystemservice(context.download_service); //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等 downloadid = downloadmanager.enqueue(request); //注册广播接收者,监听下载状态 mcontext.registerreceiver(receiver, new intentfilter(downloadmanager.action_download_complete)); } //广播监听下载的各个状态 private broadcastreceiver receiver = new broadcastreceiver() { @override public void onreceive(context context, intent intent) { checkstatus(); } }; //检查下载状态 private void checkstatus() { query query = new query(); //通过下载的id查找 query.setfilterbyid(downloadid); cursor c = downloadmanager.query(query); if (c.movetofirst()) { int status = c.getint(c.getcolumnindex(downloadmanager.column_status)); switch (status) { //下载暂停 case downloadmanager.status_paused: break; //下载延迟 case downloadmanager.status_pending: break; //正在下载 case downloadmanager.status_running: break; //下载完成 case downloadmanager.status_successful: //下载完成安装apk installapk(); break; //下载失败 case downloadmanager.status_failed: toast.maketext(mcontext, "下载失败", toast.length_short).show(); break; } } } //下载到本地后执行安装 private void installapk() { //获取下载文件的uri uri downloadfileuri = downloadmanager.geturifordownloadedfile(downloadid); if (downloadfileuri != null) { intent intent= new intent(intent.action_view); intent.setdataandtype(downloadfileuri, "application/vnd.android.package-archive"); intent.addflags(intent.flag_activity_new_task); mcontext.startactivity(intent); } } }
4、编写activity代码初始化工具类,然后下载
public class mainactivity extends appcompatactivity { private downloadutils downloadutils; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); downloadutils = new downloadutils(mainactivity.this); downloadutils.downloadapk("http://192.168.1.104:8080/xxx.apk", "xxx.apk"); } }
5、配置权限
<!--在sdcard中创建与删除文件权限 --> <uses-permission android:name="android.permission.mount_unmount_filesystems"/> <!-- 往sdcard写入数据权限 --> <uses-permission android:name="android.permission.write_external_storage"/> <!-- 从sdcard读取数据权限 --> <uses-permission android:name="android.permission.read_external_storage"/> <!-- 访问网络权限 --> <uses-permission android:name="android.permission.internet"/>
6、运行结果
运行以后会去下载服务器的apk,通知栏也会有相应的通知。当下载完毕以后,会弹出安装界面。
通知栏
主界面
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。