android实现自动更新

Android应用自动更新

我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。

1.  准备知识

在AndroidManifest.xml里定义了每个Android apk的版本标识:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

     package="com.myapp"

     android:versionCode="1"

     android:versionName="1.0.0">

<application></application>

</manifest>

 

其中,android:versionCode和android:versionName两个字段分别表示版本代码,版本名称。 versionCode是整型数字,versionName是字符串。由于version是给用户看的,不太容易比较大小,升级检查时,可以以检查versionCode为主,方便比较出版本的前后大小。

那么,在应用中如何读取AndroidManifest.xml中的versionCode和versionName呢?可以使用PackageManager的API,参考以下代码:

publicstatic int getVerCode(Context context) { 

            int verCode = -1; 

            try { 

                verCode =context.getPackageManager().getPackageInfo( 

                        "com.myapp",0).versionCode; 

            } catch (NameNotFoundException e){ 

                Log.e(TAG,e.getMessage()); 

            } 

            return verCode; 

        } 

 

        public static String getVerName(Contextcontext) { 

            String verName = ""; 

            try { 

                verName =context.getPackageManager().getPackageInfo( 

                        "com.myapp",0).versionName; 

            } catch (NameNotFoundException e){ 

                Log.e(TAG,e.getMessage()); 

            } 

            return verName;    

    }

或者在AndroidManifest中将android:versionName=”1.2.0″写成android:versionName=”@string/app_versionName”,然后在values/strings.xml中添加对应字符串,这样实现之后,就可以使用如下代码获得版本名称:

   public static String getVerName(Contextcontext) { 

            String verName =context.getResources() 

            .getText(R.string.app_versionName).toString(); 

            return verName; 

    }

同理,apk的应用名称可以这样获得:

    public static String getAppName(Contextcontext) { 

            String verName =context.getResources() 

           .getText(R.string.app_name).toString(); 

            return verName; 

    }

2. 流程框架

比较》下载》安装。

 

3. 版本检查
在服务端放置最新版本的apk文件,如:http://localhost/myapp/myapp.apk
同时,在服务端放置对应此apk的版本信息调用接口或者文件,如:http://localhost/myapp/ver.json
ver.json中的内容为:

[{"appname":"jtapp12","apkname":"jtapp-12-updateapksamples.apk","verName":1.0.1,"verCode":2}]

然后,在手机客户端上进行版本读取和检查:

    private boolean getServerVer () { 

            try { 

                String verjson =NetworkTool.getContent(Config.UPDATE_SERVER 

                        +Config.UPDATE_VERJSON); 

                JSONArray array = newJSONArray(verjson); 

                if (array.length() > 0){ 

                    JSONObject obj =array.getJSONObject(0); 

                    try { 

                        newVerCode =Integer.parseInt(obj.getString("verCode")); 

                        newVerName =obj.getString("verName"); 

                    } catch (Exception e){ 

                        newVerCode = -1; 

                        newVerName =""; 

                        return false; 

                    } 

                } 

            } catch (Exception e) { 

                Log.e(TAG,e.getMessage()); 

                return false; 

            } 

            return true; 

        }

比较服务器和客户端的版本,并进行更新操作。

   if (getServerVerCode()) { 

             int vercode =Config.getVerCode(this); // 用到前面第一节写的方法

             if (newVerCode > vercode){ 

                 doNewVersionUpdate(); // 更新新版本

             } else { 

                 notNewVersionShow(); // 提示当前为最新版本

             } 

         }

详细方法:

  private void notNewVersionShow() { 

        int verCode =Config.getVerCode(this); 

        String verName =Config.getVerName(this); 

        StringBuffer sb = new StringBuffer(); 

        sb.append("当前版本:"); 

        sb.append(verName); 

        sb.append(" Code:"); 

        sb.append(verCode); 

        sb.append(",/n已是最新版,无需更新!"); 

        Dialog dialog = newAlertDialog.Builder(Update.this).setTitle("软件更新") 

                .setMessage(sb.toString())// 设置内容

                .setPositiveButton("确定",// 设置确定按钮

                        newDialogInterface.OnClickListener() { 

                            @Override 

                            public voidonClick(DialogInterface dialog, 

                                    int which){ 

                                finish(); 

                            } 

                        }).create();// 创建

        // 显示对话框

        dialog.show(); 

    } 

    private void doNewVersionUpdate() { 

        int verCode =Config.getVerCode(this); 

        String verName =Config.getVerName(this); 

        StringBuffer sb = newStringBuffer(); 

        sb.append("当前版本:"); 

        sb.append(verName); 

        sb.append(" Code:"); 

        sb.append(verCode); 

        sb.append(", 发现新版本:"); 

        sb.append(newVerName); 

        sb.append(" Code:"); 

        sb.append(newVerCode); 

        sb.append(", 是否更新?"); 

        Dialog dialog = new AlertDialog.Builder(Update.this) 

                .setTitle("软件更新") 

                .setMessage(sb.toString()) 

                // 设置内容

                .setPositiveButton("更新",// 设置确定按钮

                        newDialogInterface.OnClickListener() { 

                            @Override 

                            public voidonClick(DialogInterface dialog, 

                                    int which){ 

                                pBar = newProgressDialog(Update.this); 

                                pBar.setTitle("正在下载"); 

                               pBar.setMessage("请稍候..."); 

                               pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

                               downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME); 

                            } 

                        }) 

                .setNegativeButton("暂不更新", 

                        newDialogInterface.OnClickListener() { 

                            public voidonClick(DialogInterface dialog, 

                                    intwhichButton) { 

                                // 点击"取消"按钮之后退出程序

                                finish(); 

                            } 

                        }).create();// 创建

        // 显示对话框

        dialog.show(); 

    }

 

4. 下载模块

注,本部分参考了前人的相关实现,见 http://apps.hi.baidu.com/share/detail/24172508

 void downFile(final String url) { 

        pBar.show(); 

        new Thread() { 

            public void run() { 

                HttpClient client = newDefaultHttpClient(); 

                HttpGet get = newHttpGet(url); 

                HttpResponse response; 

                try { 

                    response =client.execute(get); 

                    HttpEntity entity =response.getEntity(); 

                    long length =entity.getContentLength(); 

                    InputStream is =entity.getContent(); 

                    FileOutputStream fileOutputStream =null; 

                    if (is != null) { 

                        File file = newFile( 

                               Environment.getExternalStorageDirectory(), 

                                Config.UPDATE_SAVENAME); 

                        fileOutputStream = newFileOutputStream(file); 

                        byte[] buf = newbyte[1024]; 

                        int ch = -1; 

                        int count = 0; 

                        while ((ch =is.read(buf)) != -1) { 

                           fileOutputStream.write(buf, 0, ch); 

                            count += ch; 

                            if (length > 0){ 

                            } 

                        } 

                    } 

                   fileOutputStream.flush(); 

                    if (fileOutputStream !=null) { 

                       fileOutputStream.close(); 

                    } 

                    down(); 

                } catch (ClientProtocolExceptione) { 

                    e.printStackTrace(); 

                } catch (IOException e) { 

                    e.printStackTrace(); 

                } 

            } 

        }.start(); 

    }

下载完成,通过handler通知主ui线程将下载对话框取消。

   void down() { 

            handler.post(new Runnable() { 

                public void run() { 

                    pBar.cancel(); 

                    update(); 

                } 

            }); 

    }

5. 安装应用

 void update() { 

       Intent intent = new Intent(Intent.ACTION_VIEW); 

       intent.setDataAndType(Uri.fromFile(new File(Environment 

                .getExternalStorageDirectory(),Config.UPDATE_SAVENAME)), 

               "application/vnd.android.package-archive"); 

       startActivity(intent); 

    }

如果你将apk应用发布到market上,那么,你会发现market内建了类似的模块,可以自动更新或者提醒你是否更新应用。那么,对于你自己的 应用需要自动更新的话,自己内建一个是不是更加方便了呢?本文提到的代码大多是在UpdateActivity.java中实现,为了能够使更新过程更加 友好,可以在最初launcher的Activity中建立一个线程,用来检查服务端是否有更新。有更新的时候就启动UpdateActivity,这样的使用体验更加平滑。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android应用程序的自动更新可以通过以下步骤实现: 1. 在应用程序中添加版本检查功能,以检查当前应用程序版本是否为最新版本。 2. 如果当前应用程序版本不是最新版本,则从服务器下载最新版本的应用程序。 3. 下载完成后,使用Android的PackageInstaller API安装新版本的应用程序。 4. 在应用程序中添加后台服务,以定期检查新版本的应用程序是否可用,并在发现新版本时自动下载和安装。 5. 在应用程序中添加设置选项,以允许用户选择是否启用自动更新功能,并设置更新检查的时间间隔。 6. 在应用程序中添加通知功能,以通知用户新版本的应用程序已经下载并准备安装。 以上是Android应用程序自动更新的基本实现步骤。需要注意的是,在实现自动更新功能时,需要确保应用程序的安全性和稳定性,并遵循Google Play Store的开发者政策和规定。 ### 回答2: Android应用自动更新功能对于用户来说是非常方便的,因为可以自动升级应用程序并不需要用户手动下载或更新应用。从开发人员的角度来看,自动更新也可以提高应用程序的可靠性和安全性。 实现Android应用的自动更新,一般需要应用程序具有以下特点: 1.应用程序需要有版本号:在应用程序中设置版本号,可以让应用程序知道当前的版本,从而实现更新。 2.应用程序需要能够获取服务器的最新版本号:一般是通过网络请求(HTTP请求接口)获取服务器的最新版本号。 3.应用程序需要将最新版本号与当前版本号进行比较:如果最新版本号大于当前版本号,则需要进行更新。 4.应用程序需要自动下载最新版本的APK文件:一般是通过下载管理器进行下载。 5.安装最新版本:通过调用系统的安装器来安装最新版本的APK文件。 在实现自动更新的过程中,需要做好以下几方面的工作: 1.确定应用程序的版本号,并与服务器上的版本号保持同步。 2.建立服务器端接口,提供应用程序的版本信息,以供客户端获取。 3.客户端获取最新版本信息后进行比较,根据比较结果决定是否需要更新。 4.下载最新版本的APK文件,并确保下载过程中不出现错误。 5.执行APK文件安装,并确保在安装过程中不出现错误。 总的来说,实现Android应用的自动更新需要对Android开发框架、网络通信、下载、存储、安装等方面有比较深入的了解,需要开发人员具备一定的技术实力。如果需要实现这个功能,可以参考Android开发文档、开源框架或网上的相关教程,以实现自动更新的功能。 ### 回答3: Android应用的自动更新是一种很重要的功能,可以方便地向用户推送新版本,并解决了用户手动更新应用的繁琐问题。下面将介绍如何实现Android app自动更新。 1. 获取新版本信息 首先,我们需要在应用服务器上存储最新版本的信息,包括版本号、版本名、更新说明、下载链接等。当用户打开应用时,应用可以向服务器请求最新版本的信息。如果服务器返回的版本号大于当前应用版本号,就说明有新版本,需要更新。否则,应用继续运行。 2. 下载新版本apk 获取新版本信息后,应用需要下载最新版本的apk文件。一般情况下,我们会把apk文件上传到服务器,并返回下载链接。应用可以通过建立HTTP连接来下载apk文件,并保存到本地存储器。下载完毕后,应用需要获取文件头,获取apk文件的版本号和包名。 3. 安装新版本apk 下载完成后,应用需要自动打开安装新版应用。由于apk文件需要具有写操作权限才能被安装,因此需要在AndroidManifest.xml文件中添加读写文件权限。安装时需要调用系统提供的安装接口来完成。调用语句如下: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); startActivity(intent); 其中,f是apk文件的File对象。开始安装后,系统会提示用户是否允许应用获取读写权限,如果用户没有允许,安装过程会中断。 4. 其他实现细节 为避免重复下载,可以在服务器端设定最新版本的HASH值,app检查是否有新版本的时候通过HASH检查是否更新。 新版本需要提醒用户更改了什么,这就需要app在服务器端声明release notes,app通过检查新版本的主要变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值