AndroidAPP更新升级完整实现Demo(搭建本地服务器) .

来源:互联网 发布:c 浏览器源码 编辑:程序博客网 时间:2024/05/18 12:34

市场上的Android应用都能够自动提示升级更新,这里就完整的来实现一下AndroidAPP,实现自动升级的功能。

Demo地址:http://download.csdn.net/detail/ericfantastic/9250609

效果图:


具体如何实现,其实不难,先看看流程:




本地AndroidApp必须要先有一个版本号用于标识当前版本,再从服务器获取服务器最新版本,进行相比较。


实现流程:

1、Manifest.xml添加联网权限,读写SD卡权限,版本号versionCode和版本名versionName,其中versionCode用来比较版本使用的变量,versionName为用于显示在界面上的版本字符串。

[html] view plain copy print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.eric.androidupdatedemo"  
  4.     android:versionCode="1"  
  5.     android:versionName="01.00.01" >  
  6.     <uses-permission android:name='android.permission.INTERNET'/> <!-- 联网权限 -->  
  7.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  <!-- 写入SD卡权限 -->  
  8.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    <!-- 在SD卡中创建和删除文件的权限 -->  
  9.     <uses-sdk  
  10.         android:minSdkVersion="14"  
  11.         android:targetSdkVersion="14" />  
  12.   
  13.     <application  
  14.         android:allowBackup="true"  
  15.         android:icon="@drawable/ic_launcher"  
  16.         android:label="@string/app_name"  
  17.         android:theme="@style/AppTheme" >  
  18.         <activity  
  19.             android:name=".MainActivity"  
  20.             android:label="@string/app_name" >  
  21.             <intent-filter>  
  22.                 <action android:name="android.intent.action.MAIN" />  
  23.   
  24.                 <category android:name="android.intent.category.LAUNCHER" />  
  25.             </intent-filter>  
  26.         </activity>  
  27.     </application>  
  28.   
  29. </manifest>  

2、activity_main.xml布局文件,简单的几个控件。

[html] view plain copy print?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context="com.eric.androidupdatedemo.MainActivity" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/textview_id"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="@string/hello_world" />  
  16.       
  17.     <Button   
  18.         android:id="@+id/button_id"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="40dp"  
  21.         android:layout_below="@id/textview_id"  
  22.         android:textColor="#FFF"  
  23.         android:text="检查更新"  
  24.         android:background="@drawable/buttonbg"  
  25.         />  
  26.     <ProgressBar   
  27.         android:id="@+id/progressBar_id"  
  28.         style="@android:style/Widget.ProgressBar.Horizontal"    
  29.         android:layout_width="match_parent"  
  30.         android:layout_height="40dp"  
  31.         android:layout_below="@id/button_id"  
  32.         android:layout_marginTop="10dp"  
  33.         android:visibility="gone"/>  
  34. </RelativeLayout>  


3、MainActivity.java界面初始化,调用更新类的方法,刷新页面数据。

[java] view plain copy print?
  1. package com.eric.androidupdatedemo;  
  2.   
  3. import java.io.File;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.AlertDialog;  
  7. import android.app.AlertDialog.Builder;  
  8. import android.content.Context;  
  9. import android.content.Intent;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.os.Environment;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.view.Window;  
  18. import android.widget.Button;  
  19. import android.widget.ProgressBar;  
  20. import android.widget.TextView;  
  21.   
  22. public class MainActivity extends Activity {  
  23.     private TextView textView;  
  24.     public static int version,serverVersion;  
  25.     public static String versionName,serverVersionName,downloadResult;  
  26.     private Button btn;  
  27.     private ProgressBar proBar;  
  28.     public static receiveVersionHandler handler;  
  29.     private UpdateManager manager = UpdateManager.getInstance();  
  30.       
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.           
  36.         textView = (TextView) findViewById(R.id.textview_id);  
  37.         btn = (Button) findViewById(R.id.button_id);  
  38.         proBar=(ProgressBar)findViewById(R.id.progressBar_id);  
  39.           
  40.         Context c = this;  
  41.         version = manager.getVersion(c);  
  42.         versionName = manager.getVersionName(c);  
  43.           
  44.         textView.setText("当前版本号:"+version+"\n"+"当前版本名:"+versionName);  
  45.           
  46.         handler = new receiveVersionHandler();  
  47.           
  48.         //检查更新按钮点击事件   
  49.         btn.setOnClickListener(new OnClickListener() {  
  50.             @Override  
  51.             public void onClick(View v) {  
  52.                 manager.compareVersion(MainActivity.this);  
  53.             }  
  54.         });  
  55.     }  
  56.       
  57.       
  58.     public class receiveVersionHandler extends Handler{  
  59.         @Override  
  60.         public void handleMessage(Message msg) {  
  61.            proBar.setProgress(msg.arg1);  
  62.            proBar.setVisibility(R.id.button_id);  
  63.            textView.setText("下载进度:"+msg.arg1);  
  64.            if(msg.arg1 == 100){  
  65.                Intent intent = new Intent(Intent.ACTION_VIEW);   
  66.                String path = Environment.getExternalStorageDirectory()+"/AndroidUpdateDemo.apk";  
  67.                intent.setDataAndType(Uri.fromFile(new File(path)),   
  68.                        "application/vnd.android.package-archive");     
  69.                startActivity(intent);  
  70.            }  
  71.            proBar.setVisibility(R.id.button_id);  
  72.         }  
  73.   
  74.     }  
  75. }  


4、UpdateManager.java更新工具类,包含获取本地版本信息,服务器版本信息,下载apk文件等方法。
[java] view plain copy print?
  1. package com.eric.androidupdatedemo;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.File;  
  6. import java.io.FileOutputStream;  
  7. import java.net.HttpURLConnection;  
  8. import java.net.URL;  
  9.   
  10. import org.json.JSONArray;  
  11. import org.json.JSONException;  
  12. import org.json.JSONObject;  
  13.   
  14. import android.R.integer;  
  15. import android.app.AlertDialog;  
  16. import android.app.AlertDialog.Builder;  
  17. import android.content.Context;  
  18. import android.content.DialogInterface;  
  19. import android.os.Bundle;  
  20. import android.os.Environment;  
  21. import android.os.Handler;  
  22. import android.os.Looper;  
  23. import android.os.Message;  
  24.   
  25. /* 
  26.  *@author Eric  
  27.  *@2015-11-7上午8:03:31 
  28.  */  
  29. public class UpdateManager {  
  30.     private static UpdateManager manager = null;  
  31.     private UpdateManager(){}  
  32.     public static UpdateManager getInstance(){  
  33.         manager = new UpdateManager();  
  34.         return manager;  
  35.     }  
  36.       
  37.     //获取版本号   
  38.     public int getVersion(Context context){  
  39.         int version = 0;  
  40.         try {    
  41.             version = context.getPackageManager().getPackageInfo(    
  42.                     "com.eric.androidupdatedemo"0).versionCode;    
  43.         } catch (Exception e) {    
  44.              System.out.println("获取版本号异常!");  
  45.         }    
  46.         return version;  
  47.     }  
  48.       
  49.     //获取版本名   
  50.     public String getVersionName(Context context){  
  51.         String versionName = null;  
  52.         try {  
  53.             versionName = context.getPackageManager().getPackageInfo(  
  54.                     "com.eric.androidupdatedemo"0).versionName;  
  55.         } catch (Exception e) {  
  56.              System.out.println("获取版本名异常!");  
  57.         }  
  58.         return versionName;  
  59.     }  
  60.       
  61.     //获取服务器版本号   
  62.     public String getServerVersion(){  
  63.         String serverJson = null;  
  64.         byte[] buffer = new byte[128];  
  65.           
  66.         try {  
  67.             URL serverURL = new URL("http://192.168.226.106/ver.aspx");  
  68.             HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();  
  69.             BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());  
  70.             int n = 0;  
  71.             while((n = bis.read(buffer))!= -1){  
  72.                 serverJson = new String(buffer);  
  73.             }  
  74.         } catch (Exception e) {  
  75.             System.out.println("获取服务器版本号异常!"+e);  
  76.         }  
  77.           
  78.         return serverJson;  
  79.     }     
  80.       
  81.     //比较服务器版本与本地版本弹出对话框   
  82.     public boolean compareVersion(Context context){  
  83.           
  84.         final Context contextTemp = context;  
  85.           
  86.         new Thread(){  
  87.             public void run() {  
  88.                 Looper.prepare();  
  89.                 String serverJson = manager.getServerVersion();  
  90.                   
  91.                 //解析Json数据   
  92.                 try {  
  93.                     JSONArray array = new JSONArray(serverJson);  
  94.                     JSONObject object = array.getJSONObject(0);  
  95.                     String getServerVersion = object.getString("version");  
  96.                     String getServerVersionName = object.getString("versionName");  
  97.                       
  98.                     MainActivity.serverVersion = Integer.parseInt(getServerVersion);  
  99.                     MainActivity.serverVersionName = getServerVersionName;  
  100.                       
  101.                     if(MainActivity.version < MainActivity.serverVersion){  
  102.                         //弹出一个对话框   
  103.                         AlertDialog.Builder builder  = new Builder(contextTemp);    
  104.                         builder.setTitle("版本更新" ) ;    
  105.                         builder.setMessage("当前版本:"+MainActivity.versionName  
  106.                                 +"\n"+"服务器版本:"+MainActivity.serverVersionName ) ;    
  107.                         builder.setPositiveButton("立即更新",new DialogInterface.OnClickListener() {    
  108.                                @Override    
  109.                                public void onClick(DialogInterface dialog, int arg1) {   
  110.                                    //开启线程下载apk  
  111.                                    new Thread(){  
  112.                                        public void run() {  
  113.                                            Looper.prepare();  
  114.                                            downloadApkFile(contextTemp);  
  115.                                            Looper.loop();  
  116.                                        };  
  117.                                    }.start();  
  118.                                }    
  119.                            });    
  120.                         builder.setNegativeButton("下次再说"null);    
  121.                         builder.show();  
  122.                     }else{  
  123.                         AlertDialog.Builder builder  = new Builder(contextTemp);    
  124.                         builder.setTitle("版本信息" ) ;    
  125.                         builder.setMessage("当前已经是最新版本" ) ;    
  126.                         builder.setPositiveButton("确定",null);    
  127.                         builder.show();  
  128.                     }  
  129.                 } catch (JSONException e) {  
  130.                     e.printStackTrace();  
  131.                     System.out.println("获取服务器版本线程异常!"+e);  
  132.                 }  
  133.                   
  134.                 Looper.loop();  
  135.             };  
  136.               
  137.         }.start();  
  138.           
  139.           
  140.           
  141.           
  142.           
  143.         return false;  
  144.     }  
  145.       
  146.       
  147.     //下载apk文件   
  148.     public void downloadApkFile(Context context){  
  149.         String savePath = Environment.getExternalStorageDirectory()+"/AndroidUpdateDemo.apk";  
  150.         String serverFilePath = "http://192.168.226.106/AndroidUpdateDemo.png";  
  151.         try {  
  152.             if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){    
  153.                 URL serverURL = new URL(serverFilePath);  
  154.                 HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();  
  155.                 BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());  
  156.                 File apkfile = new File(savePath);  
  157.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));  
  158.                   
  159.                 int fileLength = connect.getContentLength();  
  160.                 int downLength = 0;  
  161.                 int progress = 0;  
  162.                 int n;  
  163.                 byte[] buffer = new byte[1024];  
  164.                 while((n=bis.read(buffer, 0, buffer.length))!=-1){  
  165.                     bos.write(buffer, 0, n);  
  166.                     downLength +=n;  
  167.                     progress = (int) (((float) downLength / fileLength) * 100);  
  168.                     Message msg = new Message();  
  169.                     msg.arg1 = progress;  
  170.                     MainActivity.handler.sendMessage(msg);  
  171.                     //System.out.println("发送"+progress);  
  172.                 }  
  173.                 bis.close();  
  174.                 bos.close();  
  175.                 connect.disconnect();  
  176.             }   
  177.               
  178.         } catch (Exception e) {  
  179.             System.out.println("下载出错!"+e);  
  180.         }  
  181.           
  182.   
  183.         /*AlertDialog.Builder builder  = new Builder(context);   
  184.         builder.setTitle("下载apk" ) ;   
  185.         builder.setMessage("正在下载" ) ;   
  186.         builder.setPositiveButton("确定",null);   
  187.         builder.show();*/  
  188.           
  189.           
  190.           
  191.     }  
  192. }  

具体实现都在UpdateManager类中,详细说明一下,其中,

getVersion(Context context)、getVersionName(Context context)本地版本的获取很简单一看就懂;

getServerVersion()服务器版本的获取:读取服务器目录下的ver.aspx文件,返回json字符串;

compareVersion(Context context)比较版本:启动线程,读取json字符串,并解析服务器版本赋值到serverVersion中,并且比较本地版本和服务器版本,如果低于服务器版本,就启动新线程下载apk文件;

downloadApkFile(Context context)下载apk文件:设置文件保存路径,服务器访问路径,通过HTTP协议下载文件,这里测试的时候,apk文件无法下载,故将服务器的apk修改扩展名为png格式,下载完成后保存为apk文件。









搭建本地Web服务器:

1、开启功能:控制面板-> 程序-> 程序和功能 -> 打开或关闭Windows功能,将“Internet信息服务”下的所有功能都打开。


2、设置防火墙:控制面板-> 系统安全 -> Windows防火墙 -> 允许程序通过Windows防火墙,勾选“万维网服务(HTTP)”。


3、以上步骤完成后,web服务器就搭好了,可以win+R,运行cmd,键入ipconfig /all ,查看本机IP地址,打开浏览器输入地址ip地址测试一下,如果打开的是IIS7网页,说明成功了。

然后就是将新版本的apk放到服务器目录下,一般是系统盘目录下C:\inetpub\wwwroot文件夹中。

放置两个文件,一个是2.0版本的apk文件,一个是ver.aspx文件用于获取服务器版本的json字符串,里面的内容为:[{"appname":"AndroidUpdateDemo","apkname":"AndroidUpdateDemo.apk","versionName":"02.00.01","version":"2"}] 。

由于测试时候apk文件无法直接下载,想了个办法将apk文件扩展名改为png,在Android端下载完成后把它在保存为apk文件。



上述操作结束后,服务器端就完全搭好了,可以开始测试升级流程。

1 0
原创粉丝点击