Android 开发中 app版本更新功能

原创 2016年08月29日 10:41:57

每个app中 都不能缺少的一个功能就是app版本的更新功能了。

大概的步骤就是,首先打开app,点开更新或者自动推送,提示有没有新的版本需要更新,如果没有点击取消,如果有则选择下载安装。

代码:

private void showUpdateDialog() {
		// TODO Auto-generated method stub
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setTitle("请升级APP至版本" + version);
		// builder.setMessage(info.getDescription());
		builder.setCancelable(false);

		builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					down(); // 在下面的代码段
				} else {
					Toast.makeText(getActivity(), "SD卡不可用,请插入SD卡",
							Toast.LENGTH_SHORT).show();
				}
			}

		});
		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}

		});
		builder.create().show();
	}

	private boolean isNeedUpdate() {
		// TODO Auto-generated method stub
		String v = version;// 服务器上的最新版本的版本号
		Log.i("upate", v);
		// Toast.makeText(getActivity(), v, Toast.LENGTH_SHORT).show();
		if (v.equals(getVersion())) {
			Toast.makeText(getActivity(), "以是最新版本!", Toast.LENGTH_SHORT).show();
			return false;
		} else {
			return true;
		}
	}

	// 获取当前本地APP版本的版本号
	private String getVersion() {
		try {
			// 获取packagemanager的实例
			PackageManager packageManager = getActivity().getPackageManager();
			// getPackageName()是你当前类的包名,0代表是获取版本信息
			PackageInfo packageInfo = packageManager.getPackageInfo(
					getActivity().getPackageName(), 0);
			return packageInfo.versionName;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
			return "版本号未知";
		}
	}

	// 获取当前本地APP版VersionCode
	public static int getVersionCode(Context context)// 获取版本号(内部识别号)
	{
		try {
			PackageInfo pi = context.getPackageManager().getPackageInfo(
					context.getPackageName(), 0);
			return pi.versionCode;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}
	}

	// 从服务器下载apk
	public static File getFileFromServer(String path, Notification notif)
			throws Exception {
		// 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			URL url = new URL(path);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			// 获取到文件的大小
			// pd.setMax(conn.getContentLength());
			notif.contentView.setProgressBar(R.id.pb, conn.getContentLength(),
					0, false);
			InputStream is = conn.getInputStream();
			File file = new File(Environment.getExternalStorageDirectory(),
					"updata.apk");
			FileOutputStream fos = new FileOutputStream(file);
			BufferedInputStream bis = new BufferedInputStream(is);
			byte[] buffer = new byte[1024];
			int len;
			int n = 0;
			int total = 0;
			while ((len = bis.read(buffer)) != -1) {
				fos.write(buffer, 0, len);
				total += len;
				while (n < 100)
					n++;
				// 获取当前下载量
				// pd.setProgress(total)
				notif.contentView.setTextViewText(R.id.down_tv, n + "%");
				notif.contentView.setProgressBar(R.id.pb, 100, total, false);
			}

			fos.close();
			bis.close();
			is.close();

			return file;
		} else {
			return null;
		}
	}

	@SuppressWarnings({ "static-access", "deprecation" })
	void down() {
		// final ProgressDialog pd; // 进度条对话框
		// pd = new ProgressDialog(getActivity());
		// pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		// pd.setMessage("正在下载更新");
		// pd.show();

		manager = (NotificationManager) getActivity().getSystemService(
				getActivity().NOTIFICATION_SERVICE);
		notif = new Notification(R.drawable.ilex_logo_app, "正在下载",
				System.currentTimeMillis());
		notif.contentView = new RemoteViews(getActivity().getPackageName(),
				R.layout.notification);
		notif.contentView.setProgressBar(R.id.pb, 100, 0, false);
		final Intent notificationIntent = new Intent(Intent.ACTION_VIEW);
		PendingIntent contentIntent = PendingIntent.getActivity(getActivity(),
				0, notificationIntent, 0);
		notif.contentIntent = contentIntent;
		manager.notify(0, notif);

		new Thread() {
			@Override
			public void run() {
				File file;
				try {
					sleep(1000);
					file = getFileFromServer(application_iGBS.getApi_downPath(), notif);
					manager.notify(0, notif);
					// pd.dismiss(); // 结束掉进度条对话框
					manager.cancel(0);
					update(file);
					System.out.println("下载完毕!!!!!!!!!!!");
					// 下载完毕后变换通知形式
					notif.flags = Notification.FLAG_AUTO_CANCEL;
					notif.contentView = null;
					Context Context = null;
					Intent intent = new Intent(Context, Notification.class);
					// 告知已完成
					intent.putExtra("completed", "yes");
					// 更新参数,注意flags要使用FLAG_UPDATE_CURRENT
					PendingIntent contentIntent = PendingIntent.getActivity(
							Context, 0, intent,
							PendingIntent.FLAG_UPDATE_CURRENT);
					notif.setLatestEventInfo(Context, "下载完成", "文件已下载完毕",
							contentIntent);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}.start();
	}

	// 安装文件,一般固定写法
	void update(File file) {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file),
				"application/vnd.android.package-archive");
		startActivity(intent);
	}
更新app的功能方法有很多,这只是其中的一种,还有就是 要注意和服务器交互要准确。信息什么的要匹配。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android App 版本更新实现

利用极光推送进行的应用升级过程。
  • CSDNhejingzhou
  • CSDNhejingzhou
  • 2016年06月18日 21:38
  • 5189

安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现

前言本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取 一种是打开应用之后提醒用户更新升级 而更新操作一般是在用户点击了升级按钮之后开始执行的...
  • u013278099
  • u013278099
  • 2016年09月28日 17:08
  • 25561

Android如何更新app的版本(中级)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://skyoceanone.blog.51cto.com/3483859/677114...
  • lizzywu
  • lizzywu
  • 2013年03月16日 14:15
  • 13442

简单实现安卓app自动更新功能

实现简单安卓app自动更新: 1.服务端提供接口 2.客户端获取接口数据,解析,获取最新版本信息 3.安装最新版本...
  • wuyinlei
  • wuyinlei
  • 2016年03月01日 13:25
  • 14322

APP自动更新功能

1.一下所讲是慕课网上的一篇课程,但是并没有提供源码,自己比着敲的,然后碰上不少问题,主要都是些容易疏忽的地方 视频连接:https://www.imooc.com/learn/6902.课前的知识...
  • qq_32239767
  • qq_32239767
  • 2017年11月22日 17:15
  • 101

一分钟实现版本更新功能——APP版本更新框架

请使用升级版XVersionUpdateVersionUpdate是一个版本更新框架,帮助我们轻松实现版本更新功能。效果图 集成步骤1. bulid.gradle添加依赖库 compile 'com...
  • a1533588867
  • a1533588867
  • 2016年09月18日 10:40
  • 2592

Android应用更新-自动检测版本及自动升级

步骤: 1.检测当前版本的信息AndroidManifest.xml–>manifest–>[Android] 2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹...
  • Imshuyuan
  • Imshuyuan
  • 2017年03月17日 13:33
  • 9448

Android实现App版本自动更新

Android实现App版本自动更新
  • IT_luntan
  • IT_luntan
  • 2016年11月04日 09:38
  • 9492

Android如何实现APP自动更新

先来看看要实现的效果图: 对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的...
  • Derbe
  • Derbe
  • 2016年11月17日 11:02
  • 6490

Android应用的自动升级、更新模块的实现

我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。首先给出界面效果: ...
  • zml_2015
  • zml_2015
  • 2016年02月27日 20:13
  • 7841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 开发中 app版本更新功能
举报原因:
原因补充:

(最多只允许输入30个字)