美文网首页androidandroid技术收藏Android开发经验谈
Android开发:使用DownloadManager在serv

Android开发:使用DownloadManager在serv

作者: 韦东锏 | 来源:发表于2015-08-06 16:43 被阅读10585次

之前一直在CSND发布文章,不过慢慢被简书的排版布局所吸引,打算迁到这个平台,这个是第一篇文章

下载并安装apk的方法很多,最好的方法是放在service中处理,这样在页面切换或者程序退出的时候,仍然可以正常的下载并弹出安装窗口。写下来主要是给自己留给备份,同时可作为分享用。

代码比较简单,分如下几块:

启动下载

private void startDownload() {
    dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    DownloadManager.Request request = new DownloadManager.Request(
            Uri.parse("http://d.koudai.com/com.koudai.weishop/1000f/weishop_1000f.apk"));
    request.setMimeType("application/vnd.android.package-archive");
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
    enqueue = dm.enqueue(request);
}

然后是监听下载完成的Receive

receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/myApp.apk")),
                    "application/vnd.android.package-archive");
            startActivity(intent);
            stopSelf();
        }
    };

在监听到下载的文件后,会调用stopSelf自动关闭该service

然后,就是在activity中,启动该service

startService(new Intent(context, DownloadService.class));

完整的代码如下:

public class DownloadService extends Service {
private DownloadManager dm;
private long enqueue;
private BroadcastReceiver receiver;

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/myApp.apk")),
                    "application/vnd.android.package-archive");
            startActivity(intent);
            stopSelf();
        }
    };

    registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    startDownload();
    return Service.START_STICKY;
}

@Override
public void onDestroy() {
    unregisterReceiver(receiver);
    super.onDestroy();
}

private void startDownload() {
    dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    DownloadManager.Request request = new DownloadManager.Request(
            Uri.parse("http://d.koudai.com/com.koudai.weishop/1000f/weishop_1000f.apk"));
    request.setMimeType("application/vnd.android.package-archive");
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
    enqueue = dm.enqueue(request);
}

}

很简单的一篇文章,希望对大家有所帮助

相关文章

网友评论

  • efc4a5722e63:其实我不是很懂不用service直接一个线程为什么不行
  • 老年追梦人:这个自带的坑太多,满足不了任何项目的需求
  • 8bdafb05088b:博主,我之前就是用DownLoadManager,但是小米不行,有什么好点的下载库么。求分享
    冷却旳_0魂:咦? 我也在小米上试了,没问题啊~
  • 6faa9bf921f7:博主,我用的你这段代码,三星手机必须手动打开下载管理器才可以下载?小米手机不报错但下载速度和下载进度一直是0,然后是下载失败,华为手机就直接下载成功了,我想问博主进行相关的适配了吗?有什么解决办法吗?
    韦东锏:@6faa9bf921f7 抱歉,没有做过适配,调用系统的下载器,确实有一些不确定的因素,目前我实际项目中,也是用网络库下载的
  • e41dc3d3ec66:不错的文章,但是有个不足之处,收到完成的事件后博主没有判断是不是当前应用下载的(因为DownloadManager是公共的),应该加上这样的判断。
    韦东锏:@Soul_of_sword 嗯,有道理
  • 最怕认真:怎么插入代码啊。。
    韦东锏:@最怕认真 用Mraddown编辑器预先写好,然后复制过来
  • Nodin:@韦东锏 是的,使用Service更合理和方便,我在做图片处理、表情包和Apk下载等采用的就是Service 从使用效果来还比较满意
  • Nodin:写的还可以
    韦东锏:@44c329b1bda4 我觉得receiver的intent应该有下载完成的path吧,这块可以去了解下
    poker1face:@韦东锏 DownloadManager用起来方便 但是我怎么在receiver中获取是哪个apk下载成功了呢?怎么给下载完成的广播添加数据呢?
    韦东锏:@Nodin 因为网上很多的例子都是放在activity中,真实项目中放在service里面才是比较合理的,所以才写了这个文章
  • 小鄧子:👍🏻

本文标题:Android开发:使用DownloadManager在serv

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