自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉。

为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了。步骤分别如下:

第一步:新建一个Android工程命名为:UpdateDemo.代码结构如下图所示:

第二步:新建一个UpdateManager.java类,负责软件更新功能模块,代码如下:

  1. package com.tutor.update;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.HttpURLConnection;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import android.app.AlertDialog;
  10. import android.app.Dialog;
  11. import android.app.AlertDialog.Builder;
  12. import android.content.Context;
  13. import android.content.DialogInterface;
  14. import android.content.Intent;
  15. import android.content.DialogInterface.OnClickListener;
  16. import android.net.Uri;
  17. import android.os.Handler;
  18. import android.os.Message;
  19. import android.view.LayoutInflater;
  20. import android.view.View;
  21. import android.widget.ProgressBar;
  22. public class UpdateManager {
  23. private Context mContext;
  24. //提示语
  25. private String updateMsg = "有最新的软件包哦,亲快下载吧~";
  26. //返回的安装包url
  27. private String apkUrl = "http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk";
  28. private Dialog noticeDialog;
  29. private Dialog downloadDialog;
  30. /* 下载包安装路径 */
  31. private static final String savePath = "/sdcard/updatedemo/";
  32. private static final String saveFileName = savePath + "UpdateDemoRelease.apk";
  33. /* 进度条与通知ui刷新的handler和msg常量 */
  34. private ProgressBar mProgress;
  35. private static final int DOWN_UPDATE = 1;
  36. private static final int DOWN_OVER = 2;
  37. private int progress;
  38. private Thread downLoadThread;
  39. private boolean interceptFlag = false;
  40. private Handler mHandler = new Handler(){
  41. public void handleMessage(Message msg) {
  42. switch (msg.what) {
  43. case DOWN_UPDATE:
  44. mProgress.setProgress(progress);
  45. break;
  46. case DOWN_OVER:
  47. installApk();
  48. break;
  49. default:
  50. break;
  51. }
  52. };
  53. };
  54. public UpdateManager(Context context) {
  55. this.mContext = context;
  56. }
  57. //外部接口让主Activity调用
  58. public void checkUpdateInfo(){
  59. showNoticeDialog();
  60. }
  61. private void showNoticeDialog(){
  62. AlertDialog.Builder builder = new Builder(mContext);
  63. builder.setTitle("软件版本更新");
  64. builder.setMessage(updateMsg);
  65. builder.setPositiveButton("下载", new OnClickListener() {
  66. @Override
  67. public void onClick(DialogInterface dialog, int which) {
  68. dialog.dismiss();
  69. showDownloadDialog();
  70. }
  71. });
  72. builder.setNegativeButton("以后再说", new OnClickListener() {
  73. @Override
  74. public void onClick(DialogInterface dialog, int which) {
  75. dialog.dismiss();
  76. }
  77. });
  78. noticeDialog = builder.create();
  79. noticeDialog.show();
  80. }
  81. private void showDownloadDialog(){
  82. AlertDialog.Builder builder = new Builder(mContext);
  83. builder.setTitle("软件版本更新");
  84. final LayoutInflater inflater = LayoutInflater.from(mContext);
  85. View v = inflater.inflate(R.layout.progress, null);
  86. mProgress = (ProgressBar)v.findViewById(R.id.progress);
  87. builder.setView(v);
  88. builder.setNegativeButton("取消", new OnClickListener() {
  89. @Override
  90. public void onClick(DialogInterface dialog, int which) {
  91. dialog.dismiss();
  92. interceptFlag = true;
  93. }
  94. });
  95. downloadDialog = builder.create();
  96. downloadDialog.show();
  97. downloadApk();
  98. }
  99. private Runnable mdownApkRunnable = new Runnable() {
  100. @Override
  101. public void run() {
  102. try {
  103. URL url = new URL(apkUrl);
  104. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  105. conn.connect();
  106. int length = conn.getContentLength();
  107. InputStream is = conn.getInputStream();
  108. File file = new File(savePath);
  109. if(!file.exists()){
  110. file.mkdir();
  111. }
  112. String apkFile = saveFileName;
  113. File ApkFile = new File(apkFile);
  114. FileOutputStream fos = new FileOutputStream(ApkFile);
  115. int count = 0;
  116. byte buf[] = new byte[1024];
  117. do{
  118. int numread = is.read(buf);
  119. count += numread;
  120. progress =(int)(((float)count / length) * 100);
  121. //更新进度
  122. mHandler.sendEmptyMessage(DOWN_UPDATE);
  123. if(numread <= 0){
  124. //下载完成通知安装
  125. mHandler.sendEmptyMessage(DOWN_OVER);
  126. break;
  127. }
  128. fos.write(buf,0,numread);
  129. }while(!interceptFlag);//点击取消就停止下载.
  130. fos.close();
  131. is.close();
  132. } catch (MalformedURLException e) {
  133. e.printStackTrace();
  134. } catch(IOException e){
  135. e.printStackTrace();
  136. }
  137. }
  138. };
  139. /**
  140. * 下载apk
  141. * @param url
  142. */
  143. private void downloadApk(){
  144. downLoadThread = new Thread(mdownApkRunnable);
  145. downLoadThread.start();
  146. }
  147. /**
  148. * 安装apk
  149. * @param url
  150. */
  151. private void installApk(){
  152. File apkfile = new File(saveFileName);
  153. if (!apkfile.exists()) {
  154. return;
  155. }
  156. Intent i = new Intent(Intent.ACTION_VIEW);
  157. i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
  158. mContext.startActivity(i);
  159. }
  160. }

第三步:在MainActivity.java也就是主Activity调用,代码如下:

  1. package com.tutor.update;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class MainAcitivity extends Activity {
  5. private UpdateManager mUpdateManager;
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. //这里来检测版本是否需要更新
  11. mUpdateManager = new UpdateManager(this);
  12. mUpdateManager.checkUpdateInfo();
  13. }
  14. }

第四步:添加程序所用的资源与权限:

下载的时候用到了ProgressBar,所以事先写了一个progress.xml布局文件,代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content">
  6. <ProgressBar
  7. android:id="@+id/progress"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. style="?android:attr/progressBarStyleHorizontal"
  11. />
  12. </LinearLayout>

下载的时候用到了网络部分,所以要在AndroidManifest.xml中添加网络权限,代码如下:

  1. <uses-permission android:name="android.permission.INTERNET" />

第五步:运行查看效果如下:

     

图一:提示有最新包                                                                                   图二:点击开始下载

图三:下载完开始安装,我这里模拟器空间不足了。

OK~大功告成了,继续看球,阿森纳已经0:1了,希望范大将军救驾!大家晚安~稍后将会为大家分享更多内容,尽请期待!

Android应用自动更新功能的实现!!!的更多相关文章

  1. Android实现自动更新功能

    Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...

  2. Android应用自动更新功能的实现!

    Android应用自动更新功能的实现!http://blog.csdn.net/android_tutor/article/details/7015986 private static final i ...

  3. Android应用自动更新功能的代码实现

    由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...

  4. Android 应用自动更新功能的代码

    由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...

  5. Android应用自动更新功能的代码实现(转)

    由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...

  6. [转]Android应用自动更新功能的代码实现

    本文转自:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html 由于Android项目开源所致,市面上出现了N多安卓软件市场.为 ...

  7. Android 软件自动更新功能实现的方法

    相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构 步骤: 1.新建一个类UpdateManger,用于显示提示更新 详细出处参考:http://www.jb51.n ...

  8. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

  9. Eclipse Android 代码自动提示功能

    Eclipse Android 代码自动提示功能 Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java ...

随机推荐

  1. 关于vi不正常退出产生的swp文件

    关于vi不正常退出产生的swp文件   非正常关闭vi编辑器时会生成一个.swp文件 关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么 ...

  2. HTML与CSS入门——第二章 发布Web内容

    知识点: 1.使用文本编辑器创建一个基本的HTML文件的方法 2.使用FTP将文件传送到你的Web服务器的方法 3.文件在Web服务器上应该存储的位置 4.在没有Web服务器的情况下分发Web内容的方 ...

  3. execlp函数使用

    原文:http://blog.sina.com.cn/s/blog_6a1837e901011167.html execlp(从PATH 环境变量中查找文件并执行)   相关函数:   fork,ex ...

  4. CSS 设计彻底研究(五)文字与图像

    第五章 文字与图像 5.1.2 设置字体 通过font-family属性设置字体.可以声明多种字体,字体之间用逗号分隔开.如一些字体名称中间有空格,需用双引号将其引起来,使浏览器知道这是一种字体的名称 ...

  5. 莫比乌斯反演题目泛做(为了对应smz的课件)

    题1:BZOJ2190 SDOI 2010 仪仗队 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 算法讨论: 我们先来考虑一个点被 ...

  6. After a rest, go on

    busy during the whole May holiday. running between S and H, waste much time leaving things behind. t ...

  7. HDU-简单计算器-1237

    这道题我做了一天,把中缀表达式转化为后缀表达式,但遇到了储存的问题,考虑了好久,写出后又调试,弄了一天,下面说一下中缀表达式转换后缀表达式: 算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直 ...

  8. Struts1.x下使用jquery的Ajax获取后台数据

        jquery中有多种Ajax方法来获取后台数据,我使用的是$.get()方法,具体的理论我不解释太多,要解释也是从别的地方copy过来的.下面就介绍我的项目中的实现方法.     前台页面: ...

  9. 【转】生产环境MySQL Server核心参数的配置

         ⑴ lower_case_table_names              ● 推荐理由                    GNU/Linux 平台,对数据库.表.存储过程等对象名称大小 ...

  10. py2exe 生成带图标的单个文件实例

    随便拉了个学习时用的测试程序来做的实例,原程序如下: #Filename:for.py count=0 for i in range(1,100,2): count+=i else: print 't ...