全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android应用App更新实例详解

前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该项目实现的就是这个功能。并且有强制更新和更新提示两种方式,当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个进度条进行下载,点击取消,则取消更新。

效果:

 

开发环境:AndroidStudio2.1.2+gradle-2.10

部分代码:

public class UpdateVersionController {
 private Context context;
 //更新文件的实例
 private AppUpdateInfo info;
 //当前版本号
 private int versionCode;
 //提示用户更新的dialog
 private Dialog dialog;
 //下载进度条
 private ProgressDialog pd;

 public static UpdateVersionController getInstance(Context context) {
 return new UpdateVersionController(context);
 }
 public UpdateVersionController(Context context) {
 this.context = context;
 }
 public void normalCheckUpdateInfo() {
 //获取版本号:这里的版本号在项目的build.gradle中是可以看到的,看复制过来的参数
 /**
 defaultConfig {
 applicationId "com.zhh.test"
 minSdkVersion 16
 targetSdkVersion 23
 versionCode 1
 versionName "1.0"
 }
 */
 versionCode = getVerCode(context);//等于19
 checkVersionTask();
 }
 public void forceCheckUpdateInfo() {//强制更新一般不用
 versionCode = getVerCode(context);//等于19
 info = new AppUpdateInfo();
 info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setVercode(2);//每次更新都靠它
 info.setVername("2.0");//版本名字
 info.setApkname("com.hellotext.1309171635.apk");
 info.setAppname("Hello");
 info.setForceUpp("yes");
 info.setUppcontent("1. Hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容
 updateApp();
 }
 /**
 * 步骤一:获取版本信息
 */
 private void checkVersionTask() {
 //网络加载获取app新版版本信息
 //这里不做请求直接赋值
 info = new AppUpdateInfo();
 info.setUrl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/"+
            "com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setVercode(2);//每次更新都靠它
 info.setVername("2.0");//版本名字
 info.setApkname("com.hellotext.1309171635.apk");
 info.setAppname("Hello");
 info.setForceUpp("no");
 info.setUppcontent("1. Hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容
 updateApp();
 }
 private void updateApp() {
 if (null != info && info.getVercode() > versionCode) {//20>19可更新
 showUpdataDialog();
 } else {
 Toast.makeText(context, "已经是最新版本啦~", Toast.LENGTH_SHORT).show();
 }
 }
 private Button cancelBtn;
 /**
 * 步骤二:弹出对话框提示用户更新
 */
 protected void showUpdataDialog() {
 dialog = new Dialog(context, android.R.style.Theme_Dialog);
 dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
 dialog.setContentView(R.layout.activity_updater);
 dialog.setCanceledOnTouchOutside(false);
 dialog.setCancelable(false);
 ((TextView) dialog.findViewById(R.id.content)).setText(info.getUppcontent());
 cancelBtn = (Button) dialog.findViewById(R.id.cancel);
 cancelBtn.setVisibility("yes".equals(info.getForceUpp()) ? View.GONE : View.VISIBLE);
 // 取消更新
 cancelBtn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 dialog.dismiss();
 }
 });
 // 确认更新
 dialog.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 dialog.dismiss();
 downLoadApk();
 }
 });
 dialog.findViewById(R.id.market).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setData(Uri.parse("market://details?id=Hello"));
 context.startActivity(intent);
 }
 });
 dialog.show();
 }
 /**
 * 步骤三:下载文件
 */
 private void downLoadApk() {
 // 进度条对话框
 pd = new ProgressDialog(context);
 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 pd.setMessage("下载中...");
 pd.setCanceledOnTouchOutside(false);
 pd.setCancelable(false);
 // 监听返回键--防止下载的时候点击返回
 pd.setOnKeyListener(new OnKeyListener() {
 @Override
 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
 Toast.makeText(context, "正在下载请稍后", Toast.LENGTH_SHORT).show();
 return true;
 } else {
 return false;
 }
 }
 });
 // Sdcard不可用
 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
 Toast.makeText(context, "SD卡不可用~", Toast.LENGTH_SHORT).show();
 } else {
 pd.show();
 //下载的子线程
 new Thread() {
 @Override
 public void run() {
 try {
 // 在子线程中下载APK文件
 File file = getFileFromServer(info.getUrl(), pd);
 sleep(1000);
 // 安装APK文件
 installApk(file);
 pd.dismiss(); // 结束掉进度条对话框
 } catch (Exception e) {
 Toast.makeText(context, "文件下载失败了~", Toast.LENGTH_SHORT).show();
 pd.dismiss();
 e.printStackTrace();
 }
 }
 }.start();
 }
 }
 /**
 * 从服务器下载apk
 */
 public File getFileFromServer(String path, ProgressDialog pd) 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() / 1024);
 InputStream is = conn.getInputStream();

 File file = new File(Environment.getExternalStorageDirectory().getPath()
 + "/blibao/merchant", "i_blibao_shop.apk");
 //判断文件夹是否被创建
 if (!file.getParentFile().exists()) {
 file.getParentFile().mkdirs();
 }
 FileOutputStream fos = new FileOutputStream(file);
 BufferedInputStream bis = new BufferedInputStream(is);
 byte[] buffer = new byte[1024];
 int len;
 int total = 0;
 while ((len = bis.read(buffer)) != -1) {
 fos.write(buffer, 0, len);
 total += len;
 // 获取当前下载量
 pd.setProgress(total / 1024);
 }
 fos.close();
 bis.close();
 is.close();
 return file;
 } else {
 return null;
 }
 }
 /**
 * 安装apk
 */
 protected void installApk(File file) {
 Intent intent = new Intent();
 // 执行动作
 intent.setAction(Intent.ACTION_VIEW);
 // 执行的数据类型
 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(intent);
 }
 /**
 * 获取版本名
 */
 public static String getVerName(Context context) {
 String verName = "";
 try {
 // 获取packagemanager的实例
 PackageManager packageManager = context.getPackageManager();
 // getPackageName()是你当前类的包名,0代表是获取版本信息
 PackageInfo packInfo = packageManager.getPackageInfo(
 context.getPackageName(), 0);

 verName = packInfo.versionName;
 } catch (Exception e) {
 e.printStackTrace();
 }
 return verName;
 }
 /**
 * 获取版本号
 */
 public static int getVerCode(Context context) {
 int verCode = -1;
 try {
 // 获取packagemanager的实例
 PackageManager packageManager = context.getPackageManager();
 // getPackageName()是你当前类的包名,0代表是获取版本信息
 PackageInfo packInfo = packageManager.getPackageInfo(
 context.getPackageName(), 0);

 verCode = packInfo.versionCode;
 } catch (Exception e) {
 e.printStackTrace();
 }
 return verCode;
 }
}

 源码下载

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# android  # app更新  # android程序更新  # app更新源码  # Android编程实现自动检测版本及自动升级的方法  # android实现程序自动升级到安装示例分享(下载android程序安装包)  # Android编程实现应用自动更新、下载、安装的方法  # Android App实现应用内部自动更新的最基本方法示例  # 安卓(Android)应用版本更新方法  # Android应用自动更新功能实现的方法  # Android应用APP自动更新功能的代码实现  # Android应用强制更新APP的示例代码  # 非常实用的小功能 Android应用版本的更新实例  # Android应用更新之自动检测版本及自动升级  # 对话框  # 英文  # 进度条  # 弹出  # 新和  # 很好看  # 不可用  # 下载量  # 都是  # 两种  # 当你  # 你有  # 可以看到  # 不做  # 点击下载  # 它会  # 最新版本  # 则在  # 该项目  # 机上 


相关文章: 招贴海报怎么做,什么是海报招贴?  如何注册花生壳免费域名并搭建个人网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何快速搭建高效香港服务器网站?  如何在阿里云虚拟主机上快速搭建个人网站?  网站制作的步骤包括,正确网址格式怎么写?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何选择美橙互联多站合一建站方案?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  南平网站制作公司,2025年南平市事业单位报名时间?  C++中引用和指针有什么区别?(代码说明)  如何将凡科建站内容保存为本地文件?  javascript中对象的定义、使用以及对象和原型链操作小结  如何通过IIS搭建网站并配置访问权限?  建站ABC备案流程中有哪些关键注意事项?  网站app免费制作软件,能免费看各大网站视频的手机app?  建站主机是否属于云主机类型?  Python多线程使用规范_线程安全解析【教程】  制作公司内部网站有哪些,内网如何建网站?  如何选择PHP开源工具快速搭建网站?  如何在阿里云高效完成企业建站全流程?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  简历在线制作网站免费版,如何创建个人简历?  平台云上自助建站如何快速打造专业网站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  h5在线制作网站电脑版下载,h5网页制作软件?  济南专业网站制作公司,济南信息工程学校怎么样?  实现虚拟支付需哪些建站技术支撑?  建站之星安装需要哪些步骤及注意事项?  如何在Tomcat中配置并部署网站项目?  如何在IIS7中新建站点?详细步骤解析  b2c电商网站制作流程,b2c水平综合的电商平台?  家庭服务器如何搭建个人网站?  如何通过网站建站时间优化SEO与用户体验?  如何批量查询域名的建站时间记录?  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何选购建站域名与空间?自助平台全解析  如何快速搭建虚拟主机网站?新手必看指南  C#如何使用XPathNavigator高效查询XML  建站之星后台密码遗忘?如何快速找回?  大连网站制作公司哪家好一点,大连买房网站哪个好?  常州企业建站如何选择最佳模板?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  宝塔建站后网页无法访问如何解决?  如何通过wdcp面板快速创建网站?  如何通过建站之星自助学习解决操作问题?  建站之星如何助力网站排名飙升?揭秘高效技巧 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。