博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发之自带下载器DownloadManager的使用
阅读量:6716 次
发布时间:2019-06-25

本文共 3929 字,大约阅读时间需要 13 分钟。

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;            }        }        c.close();    }    //下载到本地后执行安装    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);            mContext.unregisterReceiver(receiver);        }    }}复制代码

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、配置权限

复制代码

6、运行结果

运行以后会去下载服务器的Apk,通知栏也会有相应的通知。当下载完毕以后,会弹出安装界面。

  • 通知栏

  • 主界面

转载于:https://juejin.im/post/5a3113a26fb9a0450f21efe0

你可能感兴趣的文章
回到上次目录、历史命令查找快捷方式及执行时间显示设置、查看系统版本
查看>>
略论软件模块的加载策略
查看>>
siege 输出结果 理解
查看>>
C语言学习趣事_20_Assert_Setjmp
查看>>
Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划
查看>>
同一个工程下使用多个.C文件的设计(模块化设计)
查看>>
java贪吃蛇
查看>>
history
查看>>
LeetCode-4Sum
查看>>
GraphicsMagick安装&make命令使用
查看>>
用MeanJS和Yeoman生成器生成【翻译】
查看>>
加个图
查看>>
docker之container
查看>>
入园第一天
查看>>
使用BackgroundWorker解决窗口卡死
查看>>
Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决!
查看>>
【演讲实录】下一代企业级应用架构管理体系
查看>>
1.11考试
查看>>
变量和数据类型 .py
查看>>
最小生成树专题总结
查看>>