根据网上的然后小改
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;


public class UpdateManager {
private Context mContext;
private final String updateMsg = "亲,有新版本,要更新吗!"; //下载消息提示
private Dialog noticeDialog; //下载提示对话框
private Dialog downloadDialog; //下载进度对话框
private ProgressBar mProgressBar; //进度条
private Boolean interceptFlag = false; //标记用户是否在下载过程中取消下载
private Thread downloadApkThread = null; //下载线程
private final String apkUrl = "http://www.xxx/xxx.apk"; //apk的URL地址
private final String savePath = "/sdcard/UpdateDemo/"; //下载的apk存放的路径
private final String saveFileName = savePath + "xxx.apk"; //下载的apk文件
private int progress = 0; //下载进度
private final int DOWNLOAD_ING = 1; //标记正在下载
private final int DOWNLOAD_OVER = 2; //标记下载完成
private final String TAG="版本更新";
//日志打印标签
private Handler mhandler = new Handler() { //更新UI的handler

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case DOWNLOAD_ING:
// 更新进度条
mProgressBar.setProgress(progress);
break;
case DOWNLOAD_OVER:
downloadDialog.dismiss();
installApk();
//安装
break;
default:
break;
}
}

};

/*
* 构造方法
*/
public UpdateManager(Context context) {
this.mContext = context;
}

/*
* 检查是否有需要更新,具体比较版本xml
*/
public void checkUpdate() {
// 到服务器检查软件是否有新版本
//如果有则
showNoticeDialog();
}

/*
* 显示版本更新对话框
*/
private void showNoticeDialog() {
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("版本更新");
builder.setMessage(updateMsg);
builder.setPositiveButton("更新", new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
noticeDialog.dismiss();
showDownloadDialog();
}
});
builder.setNegativeButton("以后再说", new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
noticeDialog.dismiss();
}
});
noticeDialog = builder.create();
noticeDialog.show();

}

/*
* 弹出下载进度对话框
*/
private void showDownloadDialog() {
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("软件更新");
final LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.progress, null);
mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);
builder.setView(v);
builder.setNegativeButton("取消", new OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
downloadDialog.dismiss();
interceptFlag = true;
}
});
downloadDialog = builder.create();
downloadDialog.show();
downloadLatestVersionApk();

}

/*
* 下载最新的apk文件
*/
private void downloadLatestVersionApk() {
downloadApkThread = new Thread(downloadApkRunnable);
downloadApkThread.start();
}

//匿名内部类,apk文件下载线程
private Runnable downloadApkRunnable = new Runnable() {

public void run() {
try {
URL url = new URL(apkUrl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setConnectTimeout(5*1000);
conn.connect();
int length = conn.getContentLength();
Log.e(TAG, "总字节数:"+length);
InputStream is = conn.getInputStream();
File file = new File(savePath);
if (!file.exists()) {
file.mkdir();
}
File apkFile = new File(saveFileName);
FileOutputStream out = new FileOutputStream(apkFile);
int count = 0;
int readnum = 0;
byte[] buffer = new byte[1024];
do {
readnum = is.read(buffer);
count += readnum;
progress = (int) (((float) count / length) * 100);
Log.e(TAG, "下载进度"+progress);
mhandler.sendEmptyMessage(DOWNLOAD_ING);
if (readnum <= 0) {
// 下载结束
mhandler.sendEmptyMessage(DOWNLOAD_OVER);
break;
}
out.write(buffer,0,readnum);
} while (!interceptFlag);
is.close();
out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
};
/*
* 安装下载的apk文件
*/
private void installApk() {
File file= new File(saveFileName);
if(!file.exists()){
return;
}
Intent intent= new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
}



更多相关文章

  1. Android中当前时间的动态显示
  2. Android(安卓)实现apk文件下载并自动安装
  3. Android调用系统下载服务下载文件
  4. android 进度对话框的使用
  5. Android(安卓)常见问题收集 (持续更新)
  6. android三个选项的对话框
  7. android更新UI的几种方法
  8. 几本适合新手的Android电子书(提供下载)
  9. Android中如何使用基于回调的事件处理

随机推荐

  1. Android(安卓)apk 的反编译及保护杂谈
  2. Android(安卓)1.5 1.6 2.0 2.1 2.2 2.3 3
  3. ListView添加事件并获取选中项的值
  4. 交叉编译e2fsprogs For android
  5. Android(安卓)仿通讯录侧边栏滑动 SiderB
  6. android 5.0 修改默认壁纸
  7. android L 的开机动画流程
  8. Flutter&Android&Ios混合工程---1
  9. Android中ViewPager和PagerAdapter的简单
  10. Android(安卓)源码编译环境的搭建