Android版本更新

各种平台软件更新做法差不多,大体做法如下:

1.服务器存放一个最新版本的xml文件,或者存在数据库,各种做法都可以。

1.1xml文件存储verCode verName updateUrl等信息

1.2用户安装的软件的verCode和服务器上取得的做比较,检测到版本低就更新

2.下面是Android手机软件版本更新的教程

2.1项目目录

2.2编写UpdateManager类

package  com.doublejun.update;
 
import  java.io.File;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
 
import  android.app.AlertDialog;
import  android.app.AlertDialog.Builder;
import  android.app.Dialog;
import  android.content.Context;
import  android.content.DialogInterface;
import  android.content.Intent;
import  android.content.DialogInterface.OnClickListener;
import  android.content.IntentFilter;
import  android.net.Uri;
import  android.os.Handler;
import  android.os.Message;
import  android.util.Log;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.widget.ProgressBar;
 
public  class  UpdateManager {
     private  Context mContext;
     private  final  String updateMsg = "亲,有新版本,快下载吧!" ;            //下载消息提示
     private  Dialog noticeDialog;                                        //下载提示对话框
     private  Dialog downloadDialog;                                      //下载进度对话框
     private  ProgressBar mProgressBar;                                   //进度条
     private  Boolean interceptFlag = false ;                              //标记用户是否在下载过程中取消下载
     private  Thread downloadApkThread = null ;                            //下载线程
     private  final  String apkUrl = "http://www.ypdm.com/hyjj.apk" ;       //apk的URL地址
     private  final  String savePath = "/sdcard/UpdateDemo/" ;              //下载的apk存放的路径
     private  final  String saveFileName = savePath + "hyjjrelease.apk" ;   //下载的apk文件
     private  int  progress = 0 ;                                           //下载进度
     private  final  int  DOWNLOAD_ING = 1 ;                                 //标记正在下载
     private  final  int  DOWNLOAD_OVER = 2 ;                                //标记下载完成
     private  final  String TAG= "版本更新" ;                                    //日志打印标签
     private  Handler mhandler = new  Handler() {                          //更新UI的handler
 
         @Override
         public  void  handleMessage(Message msg) {
             super .handleMessage(msg);
             switch  (msg.what) {
             case  DOWNLOAD_ING:
                 // 更新进度条
                 mProgressBar.setProgress(progress);
                 break ;
             case  DOWNLOAD_OVER:
                 downloadDialog.dismiss();
                 installApk();
                 //安装
                 break ;
             default :
                 break ;
             }
         }
 
     };
     
     /*
      * 构造方法
      */
     public  UpdateManager(Context context) {
         this .mContext = context;
     }
 
     /*
      * 检查是否有需要更新,具体比较版本xml
      */
     public  void  checkUpdate() {
         // 到服务器检查软件是否有新版本
         //如果有则
         showNoticeDialog();
     }
 
     /*
      * 显示版本更新对话框
      */
     private  void  showNoticeDialog() {
         AlertDialog.Builder builder = new  Builder(mContext);
         builder.setTitle( "版本更新" );
         builder.setMessage(updateMsg);
         builder.setPositiveButton( "更新" , new  OnClickListener() {
 
             public  void  onClick(DialogInterface dialog, int  which) {
                 noticeDialog.dismiss();
                 showDownloadDialog();
             }
         });
         builder.setNegativeButton( "以后再说" , new  OnClickListener() {
 
             public  void  onClick(DialogInterface dialog, int  which) {
                 noticeDialog.dismiss();
             }
         });
         noticeDialog = builder.create();
         noticeDialog.show();
 
     }
 
     /*
      * 弹出下载进度对话框
      */
     private  void  showDownloadDialog() {
         AlertDialog.Builder builder = new  Builder(mContext);
         builder.setTitle( "软件更新" );
         final  LayoutInflater inflater = LayoutInflater.from(mContext);
         View v = inflater.inflate(R.layout.progress, null );
         mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);
         builder.setView(v);
         builder.setNegativeButton( "取消" , new  OnClickListener() {
 
             public  void  onClick(DialogInterface dialog, int  which) {
                 downloadDialog.dismiss();
                 interceptFlag = true ;
             }
         });
         downloadDialog = builder.create();
         downloadDialog.show();
         downloadLatestVersionApk();
 
     }
     
     /*
      * 下载最新的apk文件
      */
     private  void  downloadLatestVersionApk() {
         downloadApkThread = new  Thread(downloadApkRunnable);
         downloadApkThread.start();
     }
     
     //匿名内部类,apk文件下载线程
     private  Runnable downloadApkRunnable = new  Runnable() {
 
         public  void  run() {
             try  {
                 URL url = new  URL(apkUrl);
                 HttpURLConnection conn = (HttpURLConnection) url
                         .openConnection();
                 conn.connect();
                 int  length = conn.getContentLength();
                 Log.e(TAG, "总字节数:" +length);
                 InputStream is = conn.getInputStream();
                 File file = new  File(savePath);
                 if  (!file.exists()) {
                     file.mkdir();
                 }
                 File apkFile = new  File(saveFileName);
                 FileOutputStream out = new  FileOutputStream(apkFile);
                 int  count = 0 ;
                 int  readnum = 0 ;
                 byte [] buffer = new  byte [ 1024 ];
                 do  {
                     readnum = is.read(buffer);
                     count += readnum;
                     progress = ( int ) ((( float ) count / length) * 100 );
                     Log.e(TAG, "下载进度" +progress);
                     mhandler.sendEmptyMessage(DOWNLOAD_ING);
                     if  (readnum <= 0 ) {
                         // 下载结束
                         mhandler.sendEmptyMessage(DOWNLOAD_OVER);
                         break ;
                     }
                     out.write(buffer, 0 ,readnum);
                 } while  (!interceptFlag);
                 is.close();
                 out.close();
             } catch  (MalformedURLException e) {
                 e.printStackTrace();
             } catch  (IOException e) {
                 e.printStackTrace();
             }
 
         }
     };
     /*
      * 安装下载的apk文件
      */
     private  void  installApk() {
         File file= new  File(saveFileName);
         if (!file.exists()){
             return ;
         }
         Intent intent= new  Intent(Intent.ACTION_VIEW);
         intent.setDataAndType(Uri.parse( "file://" +file.toString()), "application/vnd.android.package-archive" );
         mContext.startActivity(intent);
     }
}

  2.2progress.xml文件

<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     android:orientation= "vertical"  >
 
     <ProgressBar
         android:id= "@+id/updateProgress"
         style= "?android:attr/progressBarStyleHorizontal"
         android:layout_width= "fill_parent"
         android:layout_height= "wrap_content"  />
 
</LinearLayout>

  2.3调用UpdateManager类

package  com.doublejun.update;
 
import  android.app.Activity;
import  android.os.Bundle;
 
public  class  Main extends  Activity {
     /** Called when the activity is first created. */
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         UpdateManager update = new  UpdateManager( this );
         update.checkUpdate();
     }
}

  好吧,就这些。希望对你有帮助。



转自http://www.cnblogs.com/doublejun/archive/2012/05/06/Android.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值