Android从零单排之自动跟新
自动更新原理
当我们发布我们的应用程序的时候,肯定会想到后续版本的更新,那么该怎么对我们的程序进行更新呢? 
更新APK的原理实际上就是比较程序中的AndroidManifest.xml中的versionCode进行对比,如果发现更高版本的code,则代表有新版本的程序发布,此时就可以对用户提示“请更新新版本”。 
友盟自动更新介绍
开发者当然可以自己写一个service去服务器上读取apk文件中的versionCode值,然后做比对进行分析。但是如果开发时间比较紧迫的情况下,使用第三方写好的工具,可是方便的多了。毕竟有了轮子,干嘛还要造???
友盟自动更新 
使用友盟的更新服务,就需要你把应用上传到它的服务器上,然后集成好友盟自动更新服务的apk,会去检测开发者上传的应用版本信息,如果发现服务器上的版本更高,就会提示用户有新的应用版本,然后就可以下载新版应用进行安装。
友盟支持多种更新方式:自动更新、手动更新、静默更新。
准备工作
首先需要去官网下载SDK,地址:http://www.umeng.com/component_update 
下载下来SDK之后,会看到有三个文件夹:分别是demo,jar包和res资源文件 
- 将libs下的文件拷贝到你的项目中去,其中libs/armeabi/libbspatch.so文件是用于支持增量更新功能的库。
 - 将res文件拷贝到项目中,友盟的资源文件都是以umeng_开头。
 - 配置AndroidManifest.xml文件:
 - 添加权限
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
- 1
 - 2
 - 3
 
- 添加APPKEY
 
<meta-data
            android:name="UMENG_APPKEY"
            android:value="你的APPKEY" />
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="Channel ID" />
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 
- 添加service
 
<service
        android:name="com.umeng.update.net.DownloadingService"
        android:process=":DownloadingService" >
</service>
<activity
        android:name="com.umeng.update.UpdateDialogActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 
OK,准备工作已经完毕。
自动更新
自动更新的意思就是:当打开应用之后,判断网络然后主动去检测版本更新,如果有更新,则提示用户下载更新。 
自动更新代码很简洁:
UmengUpdateAgent.update(this);
- 1
 
采用这种方式,会弹出友盟编写的对话框: 
不过这种界面有点丑。 
我们下面来对更新添加监听,然后自定义弹出框:
/**
     * 显示更新对话框
     *
     * @param updateResponse
     * @param context
     */
UmengUpdateAgent.setDefault();
        UmengUpdateAgent.setUpdateOnlyWifi(false);
        UmengUpdateAgent.setUpdateAutoPopup(false);
        UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() {
            @Override
            public void onUpdateReturned(int statusCode,
                    UpdateResponse updateResponse) {
                Toast.makeText(MainActivity.this, statusCode + "", 1000).show();
                if (statusCode == UpdateStatus.Yes && updateResponse != null) {
                    showUpdateDialog(updateResponse);
                }
            }
        });
        UpdateConfig.setDebug(true);
        UmengUpdateAgent.setRichNotification(true);
        UmengUpdateAgent.update(getApplicationContext());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 
setDefault():恢复默认设置。如果应用中不止一次调用了检测更新的方法,每次的设置并不一样的话,就需要先恢复默认设置,然后在进行设置别的参数。
setUpdateOnlyWifi():设置是否之后再wifi环境下检测。
setDeltaUpdate(): 增量更新开关。
setUpdateAutoPoup():更新提示开关。我们要自己处理更新回调,需要关闭自动弹出提示。
UmengUpdateListener():更新回调类。其中有一个回调方法onUpdateReturned(int upadteStatus, UpdateResponse upadteInfo),通过updateStatus来判断是否有更新,upodateInfo则封装了一些更新的内容,包括版本号,更新日志等。
private static void showUpdateDialog(final UpdateResponse updateResponse,
            final Context context) {
        AlertDialog.Builder updateAlertDialog = new AlertDialog.Builder(context);
        updateAlertDialog.setIcon(R.drawable.icon_app);
        updateAlertDialog.setTitle("版本更新提示");
        String showMessage = "最新版本:" + updateResponse.version + "\n"
                + "更新日志:\n" + updateResponse.updateLog;
        updateAlertDialog.setMessage(showMessage);
        updateAlertDialog.setNegativeButton("立即升级",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        File file = UmengUpdateAgent.downloadedFile(context,
                                updateResponse);
                        if (null == file) {
                            UmengUpdateAgent.startDownload(context,
                                    updateResponse);
                        } else {// 已经下载完成的最新版APK,直接安装
                            UmengUpdateAgent.startInstall(context, file);
                        }
                    }
                });
        updateAlertDialog.setNeutralButton("忽略此版本",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        UmengUpdateAgent.ignoreUpdate(context, updateResponse);
                    }
                });
        updateAlertDialog.setPositiveButton("取消", null);
        if (!((Activity) context).isFinishing())
            updateAlertDialog.show();
    }
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 
如果你需要显示更新进度,在下载APK开始、进行、结束或者失败的时候,作出相应的反应,就需要设置一下下载回调接口:
UmengUpdateAgent.setDownloadListener(new UmengDownloadListener(){
    @Override
    public void OnDownloadStart() {
        Toast.makeText(mContext, "download start" , Toast.LENGTH_SHORT).show();
    }
    @Override
    public void OnDownloadUpdate(int progress) {
        Toast.makeText(mContext, "download progress : " + progress + "%" , Toast.LENGTH_SHORT).show();
    }
    @Override
    public void OnDownloadEnd(int result, String file) {
        Toast.makeText(mContext, "download file path : " + file , Toast.LENGTH_SHORT).show();
    }
});
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 
手动更新.
在许多应用中的设置中都可以看到有“检测新版本”等类似的功能。手动更新的行为与自动更新基本一致,不同点就是不管什么网络状况,无论用户是否忽略该版本的更新,都会去检查更新。
UmengUpdateAgent.setDefault();
UmengUpdateAgent.setUpdateAutoPopup(false);
UmengUpdateAgent.forceUpdate(MainActivity.this);
UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() {
    @Override
    public void onUpdateReturned(int statusCode,
            UpdateResponse updateResponse) {
        Toast.makeText(MainActivity.this, statusCode + "", 1000).show();
        if (statusCode == UpdateStatus.Yes && updateResponse != null) {
            showUpdateDialog(updateResponse);
        }
    }
});
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 
检查出来有版本的话,怎么样操作就看你在回调函数里面怎么写了。与自动更新基本一样。
静默下载
应用场景:当用户进入首页之后,如果处于wifi下,后台检测到更新的话,自动下载,下载完成之后,通知给用户。 
相信有不少应用就是这样干的。
进本设置与上面相同。
UmengUpdateAgent.silentUpdate(this);
- 1
 
总结
Android从零单排之自动跟新的更多相关文章
- android 从零单排 第一期 按键显示helloworld
		
啦啦啦- 我是qscqesze 今天开始android的从零单排啦啦啦- 首先从最简单的开始 要求: 程序运行后,单击屏幕上的按键后可以显示一句话,如“Hello World!” 这是一个最基础最基础 ...
 - Web开发从零单排之一:在新浪云平台SAE上开发一个html5电子喜帖
		
需求描述: 本人大婚将至,女朋友说“现在都流行在微信上发电子请帖了,你不是技(cheng)术(xu)宅(yuan)嘛,不会连这个都搞不定吧” 本人嘴上说这等小事何足挂齿,但心里还是七上八下的,虽然自认 ...
 - Android从零单排之免费短信验证
		
介绍 短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息验证支付等.短信验证利用短信验证码来注册会员,大大降低了非法注册,很大程度上提高了用户账户的安全性. 目前市面上已经有了很多提供 ...
 - JAVA从零单排之前因
		
本人,男,21岁,普通院校本科,计算机专业.大学之前对计算机编程没有一点涉及.大学学计算机专业也是个偶然.因为当初高考的成绩不好,结果都是我父亲帮我报的学校和专业. 上了大学之后,大一都是在新奇中度过 ...
 - Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
		
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
 - 从零单排学Redis【铂金二】
		
前言 只有光头才能变强 好的,今天我们要上[铂金二]了,如果还没有上铂金的,赶紧先去蹭蹭经验再回来(不然不带你上分了): 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redi ...
 - 从零单排学Redis【白银】
		
前言 只有光头才能变强 今天继续来学习Redis,上一篇从零单排学Redis[青铜]已经将Redis常用的数据结构过了一遍了.如果还没看的同学可以先去看一遍再回来~ 这篇主要讲的内容有: Redis服 ...
 - 从零单排Linux – 2 – 目录权限
		
从零单排Linux – 2 – 目录权限 1.sync 讲内存数据跟新到硬盘中 2.执行等级init a: run level 0:关机 b: run level 3:纯命令模式 c:run leve ...
 - 从零单排Linux – 1 – 简单命令
		
从零单排Linux – 1 – 简单命令 Posted in: Linux 从零单排Linux – 1 一.Linux的简单命令: 1.忘记root密码: 读秒时按任意键进入 – e – ↓选择第二个 ...
 
随机推荐
- java中的匿名内部类总结(转)
			
源出处: java中的匿名内部类总结 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接 ...
 - 使用javac命令编译java文件。
			
今天想学习一下web services的知识,在网上找了一个教程,里面写了一个web services客户端调用,在cmd下执行的,但是没有给出用javac编译的细节.所以自己就借着这个机会学了一下: ...
 - FastDFS配置文件(storage.conf)
			
# 该配置文件是否生效 # false:生效 # true:无效 disabled=false # 本storage server所属组名 group_name=group1 # 绑定IP # 后面为 ...
 - 【BZOJ】【1048】【HAOI2007】分割矩阵
			
DP/记忆化搜索 暴力枚举分割方案?……大概是指数级的?大约是20!的方案= =? 但是我们看到a.b.n的范围都很小……所以不同的状态数只是$10^5$级别的,可以记忆化搜索求解 比较水的一道题…… ...
 - 笔直的水管 usaco 背包
			
背包dp入门,需要滚动数组: #include<iostream> #include<cstdio> #include<string> #include<cs ...
 - jetty启动报错Unsupported major.minor version 51.0
			
主要是JDK版本的问题,需要将Eclipse的Jdk版本设置为1.7的才可以,编译级别也设置为1.7,然后删除maven项目路径,D:\WORK\workspace\xxx\target下的所有文件, ...
 - aspx文件、aspx.cs文件、aspx.designer.cs文件之讲解
			
.aspx文件:(页面)书写页面代码.存储的是页面design代码.只是放各个控件的代码,处理代码一般放在.cs文件中. .aspx.cs文件:(代码隐藏页)书写类代码.存储的是程序代码.一般存放与数 ...
 - application/x-www-form-urlencoded multipart/form-data text/plain 的区别和作用
			
我们知道在通过POST方式向服务器发送AJAX请求时最好要通过设置请求头来指定为application/x-www-form-urlencoded编码类型.知道通过表单上传文件时必须指定编码类型为&q ...
 - maven  多套环境 配置(开发、测试、预发、正式)
			
接上一节继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre ...
 - Sqli-labs less 36
			
Less-36 我们直接看到36关的源代码 上面的check_quotes()函数是利用了mysql_real_escape_string()函数进行的过滤. mysql_real_escape_st ...