Android app的升级更新,安装,启动

我的思路是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();
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值