效果图如下:
added in API level 9.
包路径: java.lang.Object | |
↳ | android.app.DownloadManager |
此类的实例必须使用Context.getSystemService(Class),参数为DownloadManager.class或Context.getSystemService(String),参数为Context.DOWNLOAD_SERVICE。
注意:使用时需要添加下面两个权限
a、网络访问权限 <uses-permission android:name="android.permission.INTERNET" />
b、外部存储写权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
本例程主要实现的几个步骤:
1、添加权限和配置广播接收器(用于接收点击和下载完成后发出的系统广播)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<receiver android:name=".receiver.DownloadReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
</intent-filter>
</receiver>
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();
}
}