效果图如下:




added in API level 9.

包路径:
java.lang.Object
   ↳ android.app.DownloadManager
下载管理器是一个处理长时间运行的HTTP下载的系统服务,通过此API请求下载的应用程序应为ACTION_NOTIFICATION_CLICKED注册一个广播接收器,以便在用户单击通知中的正在运行的下载或从下载UI中正确处理。

此类的实例必须使用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();        }    }



更多相关文章

  1. Android(安卓)Unable to resolve target 'android-X'
  2. Android(安卓)listview子控件的的点击事件
  3. android 常用控件
  4. Android(安卓)studio怎么使用eclipse的快捷键?
  5. Android多线程断点续传详解与案例
  6. [置顶] Android:实现仿 美团/淘宝 多级分类菜单效果
  7. Notification学习
  8. Android之给ImageView添加点击效果
  9. Notification详解

随机推荐

  1. Android 登陆、提交数据或者加载数据时提
  2. Android中广告条轮播(Banner)的实现
  3. Android N for Developers(API概览)
  4. Android ApiDemos示例解析(95):Views->An
  5. Android开发:shape和selector和layer-list
  6. Android Service进程间双向通信之Messeng
  7. Android之Service&BroadCastReceiver
  8. Android实现手机静音
  9. android 应用程序退出
  10. Android基础之四大组件---Activity