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

相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能

首先看一下程序目录结构

  

步骤:

1、新建一个类UpdateManger,用于显示提示更新


代码如下:

public class UpdateManger {
 // 应用程序Context
 private Context mContext;
 // 提示消息
 private String updateMsg = "有最新的软件包,请下载!";
 // 下载安装包的网络路径
 private String apkUrl = "http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk";
 private Dialog noticeDialog;// 提示有软件更新的对话框
 private Dialog downloadDialog;// 下载对话框
 private static final String savePath = "/sdcard/updatedemo/";// 保存apk的文件夹
 private static final String saveFileName = savePath + "UpdateDemoRelease.apk";
 // 进度条与通知UI刷新的handler和msg常量
 private ProgressBar mProgress;
 private static final int DOWN_UPDATE = 1;
 private static final int DOWN_OVER = 2;


private int progress;// 当前进度
 private Thread downLoadThread; // 下载线程
 private boolean interceptFlag = false;// 用户取消下载
 // 通知处理刷新界面的handler
 private Handler mHandler = new Handler() {
  @SuppressLint("HandlerLeak")
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
   case DOWN_UPDATE:
    mProgress.setProgress(progress);
    break;
   case DOWN_OVER:
    installApk();
    break;
   }
   super.handleMessage(msg);
  }
 };
 public UpdateManger(Context context) {
  this.mContext = context;
 }
 // 显示更新程序对话框,供主程序调用
 public void checkUpdateInfo() {
  showNoticeDialog();
 }
 private void showNoticeDialog() {
  android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(
    mContext);// Builder,可以通过此builder设置改变AleartDialog的默认的主题样式及属性相关信息
  builder.setTitle("软件版本更新");
  builder.setMessage(updateMsg);
  builder.setPositiveButton("下载", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();// 当取消对话框后进行操作一定的代码?取消对话框
    showDownloadDialog();
   }
  });
  builder.setNegativeButton("以后再说", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
   }
  });
  noticeDialog = builder.create();
  noticeDialog.show();
 }
 protected void showDownloadDialog() {
  android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(mContext);
  builder.setTitle("软件版本更新");
  final LayoutInflater inflater = LayoutInflater.from(mContext);
  View v = inflater.inflate(R.layout.progress, null);

mProgress = (ProgressBar) v.findViewById(R.id.progress);
  builder.setView(v);// 设置对话框的内容为一个View
  builder.setNegativeButton("取消", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    interceptFlag = true;
   }
  });
  downloadDialog = builder.create();
  downloadDialog.show();
  downloadApk();
 }
 private void downloadApk() {
  downLoadThread = new Thread(mdownApkRunnable);
  downLoadThread.start();
 }
 protected void installApk() {
  File apkfile = new File(saveFileName);
  if (!apkfile.exists()) {
   return;
  }
  Intent i = new Intent(Intent.ACTION_VIEW);
  i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
    "application/vnd.android.package-archive");// File.toString()会返回路径信息
  mContext.startActivity(i);
 }
 private Runnable mdownApkRunnable = new Runnable() {
  @Override
  public void run() {
   URL url;
   try {
    url = new URL(apkUrl);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.connect();
    int length = conn.getContentLength();
    InputStream ins = conn.getInputStream();

File file = new File(savePath);
    if (!file.exists()) {
     file.mkdir();
    }
    String apkFile = saveFileName;
    File ApkFile = new File(apkFile);
    FileOutputStream outStream = new FileOutputStream(ApkFile);
    int count = 0;
    byte buf[] = new byte[1024];
    do {
     int numread = ins.read(buf);
     count += numread;
     progress = (int) (((float) count / length) * 100);
     // 下载进度
     mHandler.sendEmptyMessage(DOWN_UPDATE);
     if (numread <= 0) {
      // 下载完成通知安装
      mHandler.sendEmptyMessage(DOWN_OVER);
      break;
     }
     outStream.write(buf, 0, numread);
    } while (!interceptFlag);// 点击取消停止下载
    outStream.close();
    ins.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 };
}

2、新建一个xml文件,用于定义下载过程中的ProgressBar的进度显示,名为progress.xml


代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >


<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

</LinearLayout>

3、在MainActivity中onCreate()方法中,进行软件更新的检测

mUpdateManger = new UpdateManger(MainActivity.this);// 注意此处不能传入getApplicationContext();会报错,因为只有是一个Activity才可以添加窗体
mUpdateManger.checkUpdateInfo();

并且在配置清单文件中添加网络权限 <uses-permission android:name="android.permission.INTERNET" />

4、运行程序

--点击下载-->

时间: 2013-04-20

android实现百度地图自定义弹出窗口功能

我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己的数据来构造这样的弹出窗口,但是,在百度地图最新的Android SDK中,没有方便操作这种弹出窗口的类,虽然有一个PopupOverlay,但是它只支持将弹出内容转化为不多于三个Bitmap,如果这个弹出窗口里想有按钮来响应点击事件,用这个就不能满足要求了,于是,看了一遍百度地图覆盖物的API,我决定用自定义View的方法来实现类似的效果,

Android点击Button实现功能的几种方法总结

Android中Button控件应该算作是比较简单的控件,然而,它的使用频率却是非常的高,今天,我在这里总结了三种常用的点击Button实现其功能的方法. 1.很多时候,我们在用到Button控件时,往往都是"一次性"使用,这时,为了方便起见,我们一般采用的是匿名内部类的方法,形如这样: 复制代码 代码如下: button1.setOnClickListener(new OnClickListener() { @Override   public void onClick(View v

Android实现微信支付功能

开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号.API密钥,这两者缺一不可,并且在APP微信支付中使用 获得商户号.API密钥 在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号.API密钥 >申请微信支付接口 >登录商户平

android教程之把自己的应用加入到系统分享中

在自己应用的AndroidManifest.xml某个activity配置不同类型的intent-filter, 这里添加的是图片, 也可以添加其它类型 复制代码 代码如下: <intent-filter>   <action android:name="android.intent.action.SEND" />   <data android:mimeType="image/*"/>   <category androi

Android应用中使用及实现系统“分享”接口实例

为了应用的推广.传播,很多的应用中都有"分享"功能,一个按钮,点击后会出现短信.微博等等一切实现了分享功能的应用列表.这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中.Android应用中能很方便的完成这些功能,这也正是Android的伟大之处,他能很简单的完成应用之间的沟通以相互整合. 调用分享功能 1.分享文本 分享功能使用的隐式启动Activity的方法,这里的Action使用的是 ACTION_SEND. Intent sendIntent = ne

android 复制 粘贴 剪切功能应用

网上有很多复制粘贴的文章,只是放到自己的程序中不知道如何处理,现在寻得一可行方法如下: Android的剪切板(ClipboardManager) 注意:导包的时候 API 11之前: android.text.ClipboardManager API 11之后: android.content.ClipboardManager 复制代码 代码如下: /** * 实现文本复制功能 * @param content */ public static void copy(String content

Android实现下载文件功能的方法

本文所述为Android实现下载文件功能的完整示例代码,对于学习和研究android编程相信会有一定的帮助,尤其是对Android初学者有一定的借鉴价值. 完整功能代码如下: package com.test; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import and

Android中让按钮拥有返回键功能的方法及重写返回键功能

让按钮拥有返回键的功能很简单,在点击事件加上finish();就OK了. 如: 复制代码 代码如下: public void onClick(View v){ finish(); } finish() 仅仅是把activity从当前的状态退出,但是资源并没有给清理. 其实android的机制决定了用户无法完全退出application,即使用System.exit(). android自己决定何时该从内存中释放程序,当系统没有可用内存时,就会按照一定的优先级来销毁应用程序. android手机操

Android编程实现调用系统分享功能示例

本文实例讲述了Android编程实现调用系统分享功能.分享给大家供大家参考,具体如下: /** * 调用系统的分享功能 * Created by admin on 15-4-13. */ public class ShareActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

Android实现上传文件功能的方法

本文所述为一个Android上传文件的源代码,每一步实现过程都备有详尽的注释,思路比较清楚,学习了本例所述上传文件代码之后,你可以应对其它格式文件的上传.实例中主要实现上传文件至Server的方法,允许Input.Output,不使用Cache,使Androiod上传文件变得轻松. 主要功能代码如下: package com.test; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.

Android 应用APP加入聊天功能

简介 自去年 LeanCloud 发布实时通信(IM)服务之后,基于用户反馈和工程师对需求的消化和对业务的提炼,上周正式发布了「实时通信 2.0 」.设计理念依然是「灵活.解耦.可组合.可定制」,具体可以参考<实时通信开发指南>,了解 LeanCloud 实时通信的基本概念和模型. 下载和安装 可以到 LeanCloud 官方下载点下载 LeanCloud IM SDK v2 版本.将下载到的 jar 包加入工程即可. 一对一的文本聊天 我们先从最简单的环节入手,看看怎么用 LeanCloud

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能(附源码)

最近项目中需要用到ListView下拉刷新的功能,一开始想图省事,在网上直接找一个现成的,可是尝试了网上多个版本的下拉刷新之后发现效果都不怎么理想.有些是因为功能不完整或有Bug,有些是因为使用起来太复杂,十全十美的还真没找到.因此我也是放弃了在网上找现成代码的想法,自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下.相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能. 首先讲一下实现原理.这里我们将采取的方案是使用组合View的方式,先自定义一个布局

基于JS快速实现导航下拉菜单动画效果附源码下载

这是一个带变形动画特效的下拉导航菜单特效.该导航菜单在菜单项之间切换时,下拉菜单会快速的根据菜单内容的大小来动态变形,显示合适的下拉菜单大小,效果非常棒. 快速的导航下拉菜单动画效果如下所示: 效果演示         源码下载 HTML 该导航菜单的HTML结构如下: <header class="cd-morph-dropdown"> <a href="#0" class="nav-trigger">Open Nav&

jquery+css实现绚丽的横向二级下拉菜单-附源码下载

首先给大家展示下效果图: 查看效果 源码下载 html代码部分: 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head

jQuery 自定义下拉框(DropDown)附源码下载

先给大家展示下效果图,喜欢的朋友可以下载源码哦 效果演示   源码下载 <section class="main"> <div class="wrapper-demo"> <div id="dd" class="wrapper-dropdown-1" tabindex="1"> <span>手册网</span> <ul class="

JS实现快速的导航下拉菜单动画效果附源码下载

这是一个带变形动画特效的下拉导航菜单特效.该导航菜单在菜单项之间切换时,下拉菜单会快速的根据菜单内容的大小来动态变形,显示合适的下拉菜单大小,效果非常棒. 查看演示     下载源码 HTML 该导航菜单的HTML结构如下: <header class="cd-morph-dropdown"> <a href="#0" class="nav-trigger">Open Nav<span aria-hidden=&qu

Android编程实现画板功能的方法总结【附源码下载】

本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas.第一种方式的思路是,创建一个自定义View(推荐SurfaceView),在自定义View里通过Path对象记录手指滑动的路径调用lineTo()绘制:第二种方式的思路是,先用Canvas绘制一张空的Bitmap,通过ImageView的setImageBitmap()方

自定义Android六边形进度条(附源码)

本文实例讲述了Android自定义圆形进度条,分享给大家供大家参考.具体如下: 大家也可以参考这两篇文章进行学习: <自定义Android圆形进度条(附源码)>   <Android带进度的圆形进度条> 运行效果截图如下: 主要代码: package com.sxc.hexagonprogress; import java.util.Random; import android.content.Context; import android.content.res.ColorSta

Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

本文实例讲述了Android编程之ICS式下拉菜单PopupWindow实现方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 右边这个就是下拉菜单啦,看见有的地方叫他 ICS式下拉菜单,哎哟,不错哦! 下面先讲一下实现原理: 这种菜单实际上就是一个弹出式的菜单,于是我们想到android PopupWindow 类,给他设置一个view 在弹出来不就OK了吗. PopupWindow 的用法也很简单 主要方法: 步骤1.new 一个实例出来,我们使用这个构造方法即可, 复制代码 代码如

android编程之XML文件解析方法详解(附源码)

本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8

jQuery+jsp下拉框联动获取本地数据的方法(附源码)

本文实例讲述了jQuery+jsp下拉框联动获取本地数据的方法.分享给大家供大家参考,具体如下: JQuery下拉框联动很好的体现了Ajax的按需取数据的要求,减小数据的交互量.(点击此处下载源代码) 下面的实例使用Json将服务器端的类或者对象转换为JSON格式,主要运用了6个jar包 commons-beanutils-1.7.0.jar commons-collections-3.2.jar commons-lang-2.3.jar commons-logging-1.0.4.jar ez