android 自定义下载器,Android开发之自带下载器DownloadManager的使用

本文介绍如何在Android中利用DownloadManager组件从服务器下载Apk文件,并在下载完成后自动安装。首先,设置DownloadManager请求,包括下载路径、通知栏显示等。接着,创建广播接收器监听下载状态,根据状态执行相应操作,如下载成功则启动安装流程。最后,展示Activity代码和权限配置,确保下载和安装过程顺利进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新App的情形。其基本思路是根据本地的App版本号和服务器的版本号进行比较,如果服务器版本较新,再进行提示然后下载Apk最后进行安装。这种需求解决方案有很多,第三方的网络框架基本都有这个功能。

Android自带的DownloadManager是一个很好的下载文件的工具。该类在API level 9之后出现,它已经帮我们处理了下载失败、重新下载等功能,整个下载过程全部交给系统负责,不需要我们过多的处理,非常的nice。关键的是用起来也很简单,很爽,稍微封装一下就可以几句话搞定下载。

下面以一个简单案例来实现从服务器下载一个Apk文件并进行安装。

1、打开本地Tomcat服务器,放入一个Apk文件

27ee5fbef66783afafba6b56e3c90eaa.png

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,通知栏也会有相应的通知。当下载完毕以后,会弹出安装界面。

通知栏

6e203357cb4c93b6a000bc2f1ece1796.png

主界面

89d4117b69047c430bb48d0231b3a6c5.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值