Android系统自带更新DownloadManager用法
16lz
2021-01-26
效果图如下:
added in API level 9.
包路径: java.lang.Object | |
↳ | android.app.DownloadManager |
此类的实例必须使用Context.getSystemService(Class),参数为DownloadManager.class或Context.getSystemService(String),参数为Context.DOWNLOAD_SERVICE。
注意:使用时需要添加下面两个权限
a、网络访问权限
b、外部存储写权限
本例程主要实现的几个步骤:
1、添加权限和配置广播接收器(用于接收点击和下载完成后发出的系统广播)
2、广播接收器中主要实现点击事件和下载完成事件的响应;即未完成时点击跳转到下载查看页面,完成后自动调用安装应用。 public class DownloadReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); installApk(context, id); } else if (intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) { // DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); //获取所有下载任务Ids组 //long[] ids = intent.getLongArrayExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS); ////点击通知栏取消所有下载 //manager.remove(ids); //Toast.makeText(context, "下载任务已取消", Toast.LENGTH_SHORT).show(); //处理 如果还未完成下载,用户点击Notification ,跳转到下载中心 Intent viewDownloadIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); viewDownloadIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(viewDownloadIntent); } } private static void installApk(Context context, long downloadApkId) { DownloadManager dManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); Intent install = new Intent(Intent.ACTION_VIEW); Uri downloadFileUri = dManager.getUriForDownloadedFile(downloadApkId); if (downloadFileUri != null) { Log.d("DownloadManager", downloadFileUri.toString()); install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive"); install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(install); } else { Log.e("DownloadManager", "download error"); } }
3、Activity中调用更新操作
public class MainActivity extends AppCompatActivity { private String url = "https://downpack.baidu.com/appsearch_AndroidPhone_v8.0.3(1.0.65.172)_1012271b.apk"; private String title = "测试应用.apk"; private String desc = "下载完成后,点击安装"; private Button btn; private DownloadManagerUtil downloadManagerUtil; long downloadId = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); initView(); } private void findViews() { btn = findViewById(R.id.btn); } private void initView() { downloadManagerUtil = new DownloadManagerUtil(this); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (downloadId != 0) { adownloadManagerUtil.clearCurrentTask(downloadId); } downloadId = downloadManagerUtil.download(url, title, desc); } }); }
4、下载工具类DownloadManagerUtil,主要完成DownloadManager的参数设置及启动下载任务
public class DownloadManagerUtil { private Context mContext; public DownloadManagerUtil(Context context) { mContext = context; } public long download(String url, String title, String desc) { Uri uri = Uri.parse(url); DownloadManager.Request req = new DownloadManager.Request(uri); //设置WIFI下进行更新 req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); //下载中和下载完后都显示通知栏 req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //使用系统默认的下载路径 此处为应用内 /android/data/packages ,所以兼容7.0 req.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_DOWNLOADS, title); //通知栏标题 req.setTitle(title); //通知栏描述信息 req.setDescription(desc); //设置类型为.apk req.setMimeType("application/vnd.android.package-archive"); //获取下载任务ID DownloadManager dm = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); return dm.enqueue(req); } /** * 下载前先移除前一个任务,防止重复下载 * @param downloadId */ public void clearCurrentTask(long downloadId) { DownloadManager dm = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); try { dm.remove(downloadId); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } }
更多相关文章
- Android(安卓)Unable to resolve target 'android-X'
- Android(安卓)listview子控件的的点击事件
- android 常用控件
- Android(安卓)studio怎么使用eclipse的快捷键?
- Android多线程断点续传详解与案例
- [置顶] Android:实现仿 美团/淘宝 多级分类菜单效果
- Notification学习
- Android之给ImageView添加点击效果
- Notification详解