下载android应用有两种表现形式:一种是交给Android系统的下载管理器;另一种是自己去监控下载。
1.使用Android下载管理器下载应用并安装
public class UpdateService extends Service {// 安卓系统下载管理类DownloadManager manager;// 接收下载完的广播DownloadCompleteReceiver receiver;// 初始化下载器private void initDownManager(String url) {manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);receiver = new DownloadCompleteReceiver();//设置下载地址DownloadManager.Request down = new DownloadManager.Request(Uri.parse(url));// 设置允许使用的网络类型,这里是移动网络和wifi都可以down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE| DownloadManager.Request.NETWORK_WIFI);// 下载时,通知栏显示途中down.setNotificationVisibility(Request.VISIBILITY_VISIBLE);// 显示下载界面down.setVisibleInDownloadsUi(true);// 设置下载后文件存放的位置down.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS, "update.apk");// 将下载请求放入队列manager.enqueue(down);//注册下载广播registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {String url= intent.getStringExtra("url");// 调用下载initDownManager(url);return 0;}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {// 注销下载广播if (receiver != null)unregisterReceiver(receiver);super.onDestroy();}// 接受下载完成后的intentclass DownloadCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//判断是否下载完成的广播if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {System.out.println("download complete!");//获取下载的文件idlong downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);//自动安装apkinstallAPK(manager.getUriForDownloadedFile(downId));//停止服务并关闭广播UpdateService.this.stopSelf();}}/*** 安装apk文件*/private void installAPK(Uri apk) {// 通过Intent安装APK文件Intent intents = new Intent();System.out.println("auto install");intents.setAction("android.intent.action.VIEW");intents.addCategory("android.intent.category.DEFAULT");intents.setType("application/vnd.android.package-archive");intents.setData(apk);intents.setDataAndType(apk,"application/vnd.android.package-archive");intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android.os.Process.killProcess(android.os.Process.myPid());// 有的设备不加上这句的话在apk安装完成之后点击单开始可能会崩溃startActivity(intents);}}
}
2.
自己监控下载。
public class UpdateDialog extends Dialog implements OnClickListener{Button download,cancel;String apkurl="http://....../";String savePath="/**/**/update/";String saveFileName=savePath+"/adf.apk";
<pre name="code" class="java"> ProgressBar mProgress;//进度条Context mContext;
<span style="font-size:24px;"></span><pre name="code" class="java"> private static final int DOWN_UPDATE = 1;//下载更新private static final int DOWN_OVER = 2;//下载完成private static final String TAG = "UpdateManager";private int progress;//进度private Thread downLoadThread;//下载线程public static boolean interceptFlag = false;//是否中断
public UpdateDialog(Context context,String apkurl)
{
super(context);this.apkurl+=apkurlmContext=context;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.update_dialog);
download=(Button)findViewById(R.id.down);
cancel=(Button)findViewById(R.id.downcan);
mProgress=(ProgressBar)findViewById(R.id.progress_update);
download.setOnClickListener(this);
cancel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.down://点击下载
downloadApk();
dismiss();
break;
case R.id.downcan://取消下载
interceptFlag =true;
dismiss();
break;
default:
break;
}}
/** * 下载apk */
private void downloadApk()
{
downLoadThread = new Thread(mdownApkRunnable);
downLoadThread.start();
}
///** * 安装apk */
private void installApk()
{
File apkfile = new File(saveFileName);
if (!apkfile.exists())
{
return;
}
Intent i = new Intent();
i.setAction("android.intent.action.VIEW");
i.addCategory("android.intent.category.DEFAULT");
i.setType("application/vnd.android.package-archive");
i.setData(Uri.parse("file://" + apkfile.toString()));
i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(i);
}
private Runnable mdownApkRunnable = new Runnable()
{
@Override
public void run()
{
try {
URL url = new URL(apkurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
File file = new File(savePath);
if (!file.exists()) {
file.mkdir();
}
String apkFile = saveFileName;
File ApkFile = new File(apkFile);
FileOutputStream fos = new FileOutputStream(ApkFile);
int count = 0;
byte buf[] = new byte[1024];
do {
int numread = is.read(buf);
count += numread;
progress = (int) (((float) count / length) * 100);
// 更新进度//
mHandler.sendEmptyMessage(DOWN_UPDATE);
if (numread <= 0) {
// 下载完成通知安装
mHandler.sendEmptyMessage(DOWN_OVER);break;
}
fos.write(buf, 0, numread);
} while (!interceptFlag);
// 点击取消就停止下载.
fos.close();is.close();
}
catch (MalformedURLException e)
{}
catch (IOException e)
{}}};
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what) {
case DOWN_UPDATE:
mProgress.setProgress(progress);
break;
case DOWN_OVER:
//下载完成
dismiss();
installApk();
break;
default:break;
}};};}