Android从零单排之自动跟新

版权所有,禁止匿名转载;禁止商业使用。

当我们发布我们的应用程序的时候,肯定会想到后续版本的更新,那么该怎么对我们的程序进行更新呢?


更新APK的原理实际上就是比较程序中的 AndroidManifest.xml 中的 versionCode 进行对比,如果发现更高版本的code,则代表有新版本的程序发布,此时就可以对用户提示“请更新新版本”。

Android开发,自动更新


友盟自动更新介绍


开发者当然可以自己写一个service去服务器上读取apk文件中的versionCode值,然后做比对进行分析。但是如果开发时间比较紧迫的情况下,使用第三方写好的工具,可是方便的多了。毕竟有了轮子,干嘛还要造???


友盟自动更新


使用友盟的更新服务,就需要你把应用上传到它的服务器上,然后集成好友盟自动更新服务的apk,会去检测开发者上传的应用版本信息,如果发现服务器上的版本更高,就会提示用户有新的应用版本,然后就可以下载新版应用进行安装。


友盟支持多种更新方式: 自动跟新、手动更新、静默更新 。


准备工作


首先需要去官网下载SDK,地址: http://www.umeng.com/component_update


下载下来SDK之后,会看到有三个文件夹:分别是demo,jar包和res资源文件

Android开发,自动更新


将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>
添加APPKEY
<meta-data
            android:name="UMENG_APPKEY"
            android:value="你的APPKEY" />
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="Channel ID" />
添加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>

OK,准备工作已经完毕。


自动更新


自动更新的意思就是:当打开应用之后,判断网络然后主动去检测版本更新,如果有更新,则提示用户下载更新。自动更新代码很简洁:


UmengUpdateAgent.update(this);

采用这种方式,会弹出友盟编写的对话框:


Android开发,自动更新

不过这种界面有点丑。我们下面来对更新添加监听,然后自定义弹出框:


/**
   * 显示更新对话框
   * 
   * @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());


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();
}

如果你需要显示更新进度,在下载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();
  }   
});


手动更新.


在许多应用中的设置中都可以看到有“ 检测新版本 ”等类似的功能。手动更新的行为与自动更新基本一致,不同点就是 不管什么网络状况,无论用户是否忽略该版本的更新,都会去检查更新。


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);
    }
  }
});

检查出来有版本的话,怎么样操作就看你在回调函数里面怎么写了。与自动更新基本一样。


静默下载


应用场景:当用户进入首页之后,如果处于wifi下,后台检测到更新的话,自动下载,下载完成之后,通知给用户。相信有不少应用就是这样干的。


进本设置与上面相同。

UmengUpdateAgent.silentUpdate(this);

demo下载地址


0 0