手记

Android 应用的自动升级、更新模块的实现

正文转自:</p> <p>作者们看来数不清Android应用都具有自动更新功用,用户一键就能够达成软件的提高翻新。得益于Android系统的软件包管理和设置机制,这一意义实现起来十分轻巧,上面大家就来实行一下。首先付诸分界面效果:</p> <p><img src="http://static.oschina.net/uploads/img/201109/27081303_YIJ4.gif" alt="">p> <p><strong>1. 计划知识 在AndroidManifest.xml里界说了各种Android apk的本子标志:

 p> <p>print?</p> <table> 1 <manifest xmlns:android="http: schemas.android.com="" apk="" res="" android" <="" p="">

3      android:versionCode="1" 
5


当中,android:versionCode和android:versionName八个字段别离表明版别代码,版别称号。versionCode是 整型数字,versionName是字符串。由于version是给用户看的,不太轻易不小小,晋级查看时,能够以查看versionCode为主,方 便相比出版别的左右大小。 那么,在采用中哪些读取AndroidManifest.xml中的versionCode和versionName呢?能够行使PackageManager的API,参谋以下代码:

 p> <p>print?</p> <table> 01 public static int getVerCode(Context context) {

03        try {
05                    "com.myapp", 0).versionCode;
07            Log.e(TAG, e.getMessage());
09        return verCode;
11
13        String verName = "";
15            verName = context.getPackageManager().getPackageInfo(
17        } catch (NameNotFoundException e) {
19        }
21}


view source</p>


2        String verName = context.getResources()

4        return verName;


同理,apk的利用称号能够那样得到:

 p> <p>print?</p> <table> 1 public static String getAppName(Context context) {

3        .getText(R.string.app_name).toString();
5}


2. 流水生产线框架

<p font-size:medium;"="" sans serif", tahoma, verdana, helvetica; font-size: 12px; white-space: normal;"><img src="http://static.oschina.net/uploads/img/201109/27081303_fHUr.gif" alt="">p>

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

 p> <p>print?</p> <table> 01 private boolean getServerVer () {

03            String verjson = NetworkTool.getContent(Config.UPDATE_SERVER
05            JSONArray array = new JSONArray(verjson);
07                JSONObject obj = array.getJSONObject(0);
09                    newVerCode = Integer.parseInt(obj.getString("verCode"));
11                } catch (Exception e) {
13                    newVerName = "";
15                }
17        } catch (Exception e) {
19            return false;
21        return true;


比较服务器和客户端的本子,并开始展览立异操作。

 p> <p>print?</p> <table> 1 if (getServerVerCode()) {

3         if (newVerCode > vercode) {
5         } else {
7         }


详尽措施:

 p> <p>print?</p> <table> 01 private void notNewVersionShow() {

03    String verName = Config.getVerName(this);
05    sb.append("当前版别:");
07    sb.append(" Code:");
09    sb.append(",/n已是最新版,无需更新!");
11            .setMessage(sb.toString())// 设置内容
13                    new DialogInterface.OnClickListener() {
15                        public void onClick(DialogInterface dialog,
17                            finish();
19                    }).create();// 创立
21    dialog.show();
23private void doNewVersionUpdate() {
25    String verName = Config.getVerName(this);
27    sb.append("当前版别:");
29    sb.append(" Code:");
31    sb.append(", 发现新版别:");
33    sb.append(" Code:");
35    sb.append(", 是否更新?");
37        .setTitle("软件更新")
39        // 设置内容
41            new DialogInterface.OnClickListener() {
43                public void onClick(DialogInterface dialog,
45                    pBar = new ProgressDialog(Update.this);
47                    pBar.setMessage("请稍候...");
49                    downFile(Config.UPDATE_SERVER + Config.UPDATE_APKNAME);
51            })
53            new DialogInterface.OnClickListener() {
55                        int whichButton) {
57                    finish();
59            }).create();// 创立
61    dialog.show();



注,本有的参考了先驱的相关兑现,见 </p>

 > <p>print?</p> <table> <tbo< span="" >dy> 01 void downFile(final String url) {

03new Thread() {
05    HttpClient client = new DefaultHttpClient();
07    HttpResponse response;
09        response = client.execute(get);
11        long length = entity.getContentLength();
13        FileOutputStream fileOutputStream = null;
15        File file = new File(
17            Config.UPDATE_SAVENAME);
19        byte[] buf = new byte[1024];
21        int count = 0;
23            fileOutputStream.write(buf, 0, ch);
25            if (length > 0) {
27        }
29        fileOutputStream.flush();
31        fileOutputStream.close();
33        down();
35        e.printStackTrace();
37        e.printStackTrace();
39    }
41}


view source</p>


2        handler.post(new Runnable() {

4                pBar.cancel();
6            }
8}


view source</p>


2        Intent intent = new Intent(Intent.ACTION_VIEW);

4                .getExternalStorageDirectory(), Config.UPDATE_SAVENAME)),
6        startActivity(intent);

譬如您将apk使用宣布到market上,那么,你会意识market内建了看似的模块,可以自动更新也许提示您是还是不是更新使用。那么,关于你和睦的 使用供给自动更新的话,自身内建一个是或不是更为有利了吧?本文提到的代码多数是在UpdateActivity.java中完毕,为了能够使更新进度越发友爱,能够在开始时期launcher的Activity中树立三个线程,用来查看服务端是或不是有更新。有更新的时候就运营UpdateActivity,那样 的行使体验尤其平缓。
正文例程源码查看/下载: </p> <p>版权归个人全部,转载请评释出处</p> <p></p> <p> </p>


0人推荐
随时随地看视频
慕课网APP