• 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 + "
    "
                    + "更新日志:
    " + 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

    总结

    demo下载地址

  • 相关阅读:
    MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038)
    MySQL学习——管理用户权限
    Java技巧——将前端的对象数组通过Json字符串传到后端并转换为对象集合
    JDK1.8新特性——使用新的方式遍历集合
    JDK1.8新特性——Collector接口和Collectors工具类
    Java技巧——比较两个日期相差的天数
    MySQL学习——操作自定义函数
    MySQL学习——操作存储过程
    MySQL问题记录——ERROR 1728 (HY000)
    Linux上安装nginx
  • 原文地址:https://www.cnblogs.com/kluan/p/4828223.html
Copyright © 2020-2023  润新知