我的思路是app开启后,先获取服务端的信息与app的version比较是否更新,或者推送通知来更新下载,
还有通过更新按钮等然后用户有可能已经下载但没安装,所以要判断是否已下载,是的话就安装,否的
话用http下载apk,在下载过程根据每次下载的量与总量来更新进度条,最后进行安装和启动程序。
public class UpdateManager {
/* 下载中 */
private static final int DOWNLOAD = 1;
private static final int START_DOWNLOAD = 3;
/* 下载结束 */
private static final int DOWNLOAD_FINISH = 2;
/* 下载保存路径 */
// private String mSavePath;
/* 记录进度条数量 */
private int progress;
/* 是否取消更新 */
private boolean cancelUpdate = false;
private Context mContext;
/* 更新进度条 */
private ProgressBar mProgress;
private Dialog mDownloadDialog;
String version;
private MyHandler mHandler = new MyHandler(this, mContext) {
@Override
public void handlerMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
// 正在下载
case DOWNLOAD:
// 设置进度条位置
mProgress.setProgress(progress);
break;
case DOWNLOAD_FINISH:
mDownloadDialog.dismiss();
// 安装文件
installApk();
break;
case START_DOWNLOAD:
showNoticeDialog();
break;
default:
break;
}
}
};
public String isdownloadapk() {
String versionName = null;
PackageManager pm = mContext.getPackageManager();
PackageInfo pakinfo = pm.getPackageArchiveInfo(
FileShowUtil.existDownlad(mContext),
PackageManager.GET_ACTIVITIES);
if (pakinfo != null) {
// ApplicationInfo appinfo = pakinfo.applicationInfo;
versionName = pakinfo.versionName;
}
return versionName;
}
public UpdateManager(Context context) {
this.mContext = context;
}
/**
* 检测软件更新
*/
public void checkUpdate() {
//从服务器获取新版的versionname
}
/**
* 获取软件版本号
*
* @param context
* @return
*/
@SuppressLint("NewApi")
public String getVersionName() {
// int versionCode = 0;
String versionName = "";
try {
// 获取软件版本号,对应AndroidManifest.xml下android:versionName
versionName = mContext.getPackageManager().getPackageInfo(
mContext.getPackageName(), 0).versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return versionName;
}
/**
* 显示软件更新对话框
*/
public void showNoticeDialog() {
// 构造对话框
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle(R.string.soft_update_title);
builder.setMessage(R.string.soft_update_info);
// 更新
builder.setPositiveButton(R.string.soft_update_updatebtn,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
}
});
// 稍后更新
builder.setNegativeButton(R.string.soft_update_later,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
/**
* 显示软件下载对话框
*/
private void showDownloadDialog() {
// 构造软件下载对话框
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle(R.string.soft_updating).setCancelable(false);
// 给下载对话框增加进度条
final LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.softupdate_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
// mProgress.setProgress(0);
builder.setView(v);
mDownloadDialog = builder.create();
mDownloadDialog.show();
// 现在文件
downloadApk();
}
/**
* 显示软件安装对话框
*/
private void showInstallDialog() {
// 构造软件下载对话框
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle(R.string.soft_updating).setCancelable(false);
// 给下载对话框增加进度条
builder.setTitle(R.string.soft_update_title);
builder.setMessage("最新版已下载是否安装");
builder.setPositiveButton("安装", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// 显示下载对话框
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
}
});
// 稍后更新
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
mDownloadDialog = builder.create();
mDownloadDialog.show();
}
/**
* 下载apk文件
*/
private void downloadApk() {
// 启动新线程下载软件
WebApiHttpUtil.get("url",
new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
// TODO Auto-generated method stub
super.onSuccess(arg0, arg1, arg2);
File file = new File(FileShowUtil
.existDownlad(mContext));
try {
FileOutputStream outStream = new FileOutputStream(
file);
outStream.write(arg2);
outStream.flush();
outStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO: handle exception
}
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
}
@Override
public void onFailure(int statusCode, Throwable error,
String content) {
// TODO Auto-generated method stub
super.onFailure(statusCode, error, content);
ToastUtil.ShowMessage(mContext, "下载失败");
}
@Override
public void onProgress(int bytesWritten, int totalSize) {
// TODO Auto-generated method stub
super.onProgress(bytesWritten, totalSize);
progress = (int) (((float) bytesWritten / totalSize) * 100);
mHandler.sendEmptyMessage(DOWNLOAD);
}
});
}
/**
* 安装APK文件
*/
private void installApk() {
String filename = FileShowUtil.existDownlad(mContext);
if (filename == null) {
return;
}
// 通过Intent安装APK文件并启动
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + filename),
"application/vnd.android.package-archive");
mContext.startActivity(i);
// apkfile.delete();
}
}