高仿友盟自动更新支持自定义接口的自动更新
2016-08-25 23:43
246 查看
感谢作者shelwee,本项目是基于UpdateHelper项目,并参考了友盟自动更新SDK的应用交互方式而开发的一个支持自定义接口的自动更新类库。
项目地址:http://www.github.com/jjdxmashl/jjdxm_update
简书地址:http://www.jianshu.com/p/843f7cee4f46
2.自动更新:自动检测更新(所有网络类型环境检测并提示)
3.仅WiFi自动检测更新(只有WiFi网络类型环境检测并提示)
4.静默更新:仅WiFi自动检测下载(只有WiFi网络类型环境检测、下载完才提示)
2.在线参数接口用户可自定义
3.参数结构返回可以让用户自定义解析
该项目已经打包到jcenter中心了,可以通过compile命令直接依赖,在主程序目录build.gradle中,添加以下代码:
清单文件中需要配置一个activity和一个服务
这里必须配置一个在线更新接口及其的数据返回结构的解析,可选的是在线参数接口及其数据返回结构的解析,在线参数可以随机定义零个或多个不同意义的参数来达到在线修改apk的部分特性。
(1)创建一个自动更新的配置文件
(2)配置接口和解析数据,UpdateConfig文件中的,get请求,默认为get请求
post请求
(3)在Application的oncreate方法中调用进行sdk的初始化
几种方式的调用
调用方式这里只举例静默更新,其他方式类似
更新监听回调UpdateListener,主要有四个方法
项目地址:http://www.github.com/jjdxmashl/jjdxm_update
简书地址:http://www.jianshu.com/p/843f7cee4f46
简介
应用内更新,实现类似友盟自动更新sdk的更新模式,用户使用前只需要配置自己的服务器更新检查接口即可(必须接口),也可以拓展加入一个接口作为在线参数配置来实现(可选接口)可实现以下四种方式更新和是否强制更新组合使用,支持get、post方式请求网络,默认是使用get方式,支持接口返回数据自定义解析。项目地址:http://www.github.com/jjdxmashl/jjdxm_update
简书地址:http://www.jianshu.com/p/843f7cee4f46
更新检查
1.手动更新:手动检测更新(所有网络类型环境检测并提示主要用于点击检测使用)2.自动更新:自动检测更新(所有网络类型环境检测并提示)
3.仅WiFi自动检测更新(只有WiFi网络类型环境检测并提示)
4.静默更新:仅WiFi自动检测下载(只有WiFi网络类型环境检测、下载完才提示)
强制更新
强制更新(配合在线参数使得当前版本无法使用)结合以上几种方式组合使用,主要使用场景是当上一个版本的APP有重大bug或漏洞时,修改在线参数统一控制所有的APP用户,使得之前的所有版本必须要升级才能正常使用。主要原理:服务器上修改参数的数值,APP端获取后进行判断,如果为强制更新,则在打开应用是提示有新版APP更新,更新完成才能使用,提示框不消失,用户如果选择不更新则退出应用。特性
1.更新数据接口用户可自定义2.在线参数接口用户可自定义
3.参数结构返回可以让用户自定义解析
截图
demo下载
demo apk下载代码混淆
根据你的混淆器配置和使用,您可能需要在你的proguard文件内配置以下内容:后续加上
快速开始
step1:
依赖本项目类库该项目已经打包到jcenter中心了,可以通过compile命令直接依赖,在主程序目录build.gradle中,添加以下代码:
compile 'com.dou361.update-update:1.0.3'
step2:
需要权限<!--jjdxm_update更新 start--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--jjdxm_update更新 end-->
清单文件中需要配置一个activity和一个服务
<!--jjdxm_update更新 start--> <activity android:name="com.dou361.update.view.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity> <service android:name="com.dou361.update.server.DownloadingService"/> <!--jjdxm_update更新 end-->
step3:
在Application中配置,初始化配置接口和解析参数这里必须配置一个在线更新接口及其的数据返回结构的解析,可选的是在线参数接口及其数据返回结构的解析,在线参数可以随机定义零个或多个不同意义的参数来达到在线修改apk的部分特性。
(1)创建一个自动更新的配置文件
public class UpdateConfig { private static String checkUrl = "你的更新接口"; private static String onlineUrl = "你的在线参数接口"; public static void init(Context context) { UpdateHelper.init(context); UpdateHelper.getInstance() // 必填:数据更新接口 .setCheckUrl(checkUrl) // 可填:在线参数接口 .setOnlineUrl(onlineUrl) // 必填:用于从数据更新接口获取的数据response中。解析出Update实例。以便框架内部处理 .setCheckJsonParser(new ParseData() { @Override public Update parse(String response) { return null; } }) // 可填:在线参数接口 .setOnlineJsonParser(new ParseData() { @Override public String parse(String httpResponse) { return null; } }); } }
(2)配置接口和解析数据,UpdateConfig文件中的,get请求,默认为get请求
private static String checkUrl = "你的更新接口"; private static String onlineUrl = "你的在线参数接口"; public static void init(Context context) { UpdateHelper.init(context); UpdateHelper.getInstance() // 必填:数据更新接口 .setCheckUrl(checkUrl) // 可填:在线参数接口 .setOnlineUrl(onlineUrl) // 必填:用于从数据更新接口获取的数据response中。解析出Update实例。以便框架内部处理 .setCheckJsonParser(new ParseData() { @Override public Update parse(String response) { // 此处模拟一个Update对象 Update update = new Update(); // 此apk包的下载地址 update.setUpdateUrl(apkFile); // 此apk包的版本号 update.setVersionCode(2); update.setApkSize(12400000); // 此apk包的版本名称 update.setVersionName("2.0"); // 此apk包的更新内容 update.setUpdateContent("测试更新"); // 此apk包是否为强制更新 UpdateSP.setForced(false); return update; } }) // 可填:在线参数接口 .setOnlineJsonParser(new ParseData() { @Override public String parse(String httpResponse) { return null; } }); }
post请求
private static String checkUrl = "你的更新接口"; private static String onlineUrl = "你的在线参数接口"; public static void init(Context context) { UpdateHelper.init(context); TreeMap<String, Object> params = new TreeMap<String, Object>(); params.put("pkname", "com.jingwang.eluxue_online"); params.put("Action", "Apps"); params.put("SecretId", "d021e4f5tac98U4df5Nb943Odd3a313d9f68"); params.put("Region", "gz"); params.put("Nonce", Integer.valueOf((new Random()).nextInt(2147483647))); params.put("Timestamp", Long.valueOf(System.currentTimeMillis() / 1000L)); params.put("RequestClient", "SDK_JAVA_1.0"); try { params.put("Signature", Sign.sign(Sign.makeSignPlainText(params, "POST"), "FDC9BC1AA4B387CEBBF0F9355CEC2086")); } catch (Exception var9) { var9.printStackTrace(); } UpdateHelper.getInstance() // 可填:请求方式 .setMethod(UpdateHelper.RequestType.post) // 必填:数据更新接口 .setCheckUrl(checkUrl, params) // 可填:在线参数接口 .setOnlineUrl(onlineUrl) // 必填:用于从数据更新接口获取的数据response中。解析出Update实例。以便框架内部处理 .setCheckJsonParser(new ParseData() { @Override public Update parse(String response) { // 此处模拟一个Update对象 Update update = new Update(); try { JSONObject jobj = new JSONObject(response); if (!jobj.isNull("data")) { JSONObject job = jobj.optJSONObject("data"); if (!job.isNull("v_code")) { // 此apk包的版本号 update.setVersionCode(Integer.valueOf(job.optString("v_code"))); } if (!job.isNull("v_size")) { // 此apk包的大小 update.setApkSize(job.optLong("v_size")); } if (!job.isNull("v_name")) { // 此apk包的版本名称 update.setVersionName(job.optString("v_name")); } if (!job.isNull("update_content")) { // 此apk包的更新内容 update.setUpdateContent(job.optString("update_content")); } if (!job.isNull("download_url")) { // 此apk包的下载地址 update.setUpdateUrl(job.optString("download_url")); } } } catch (Exception e) { e.printStackTrace(); } // 此apk包是否为强制更新 UpdateSP.setForced(false); return update; } }) // 可填:在线参数接口 .setOnlineJsonParser(new ParseData() { @Override public String parse(String httpResponse) { return null; } }); }
(3)在Application的oncreate方法中调用进行sdk的初始化
UpdateConfig.init(this);
step4:
在mainActivity中oncreate()方法中调用//默认是自动检测更新 UpdateHelper.getInstance() .check(MainActivity.this);
step5:
在需要手动点击的方法中调用//手动检测更新 UpdateHelper.getInstance() .setUpdateType(UpdateHelper.UpdateType.checkupdate) .setUpdateListener(new UpdateListener() { @Override public void noUpdate() { Toast.makeText(mContext, "已经是最新版本了", Toast.LENGTH_LONG).show(); } @Override public void onCheckError(int code, String errorMsg) { Toast.makeText(mContext, "检测更新失败:" + errorMsg, Toast.LENGTH_LONG).show(); } }) .check(MainActivity.this);
几种方式的调用
//有网更新 UpdateHelper.UpdateType.checkupdate, //自动更新 UpdateHelper.UpdateType.autoupdate, //只有WiFi更新 UpdateHelper.UpdateType.autowifiupdate, //只有WiFi下载 UpdateHelper.UpdateType.autowifidown
调用方式这里只举例静默更新,其他方式类似
/静默更新 UpdateHelper.getInstance() .setUpdateType(UpdateHelper.UpdateType.autowifidown) .check(MainActivity.this);
更新监听回调UpdateListener,主要有四个方法
/** * There are a new version of APK on network */ public void hasUpdate(Update update) { } /** * There are no new version for update */ public abstract void noUpdate(); /** * http check error, * * @param code http code * @param errorMsg http error msg */ public abstract void onCheckError(int code, String errorMsg); /** * to be invoked by user press cancel button. */ public void onUserCancel() { }
项目地址:http://www.github.com/jjdxmashl/jjdxm_update
简书地址:http://www.jianshu.com/p/843f7cee4f46
相关文章推荐
- Excel中使用了自定义函数的单元格自动更新
- AutoCode (vs插件)自动生成代码插件 下载及使用教程(C#版)( 更新简单自定义模板教程)
- ssh-极度优化iOS设备的内存(支持全系列iOS产品和固件)更新iOS5.0.1全自动优化
- maven+mybatis+mybatis-generator+sql server 2005自动生成代码,加上自定义分页插件和批量插入更新插件
- Hadoop压缩算法不支持自定义的压缩和解压接口
- 我的购物车类,支持自定义列及自动金额计算
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
- Jfinal Model自动绑定插件更新,支持jar中model的扫描。
- ajax获取数据自动创建分页,支持自定义显示数据量以及分页数量
- [Java] JDBC 08 处理可更新的结果集 (sun提供了这样的接口,但是不见得所有的数据库厂商都支持)
- DotText实现支持自动发现服务接口
- App自动更新之自定义进度视图和内部存储
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
- 弹出下拉编辑控件,跟踪输入内容自动过滤查询,过滤条件完全自定义,支持TextBox,支持DataGridView(弹出查询对话框),支持DevExpress 8.2的TextEdit,Gridview
- android之自定义ViewGroup和自动换行的布局的实现(支持按钮间隔)
- 自定义tabbar更新,支持badge,隐藏+tableview自动分页
- 自动更新HTML FOR DedeCMS V5.3(支持首页,列表页,文章页)
- B/S和C/S架构的融合,软件客户端通过WebService接口达到自动更新和上传数据
- 自定义listview,支持上拉下拉刷新,暴露出接口,自带demo
- [Java] JDBC 08 处理可更新的结果集 (sun提供了这样的接口,但是不见得所有的数据库厂商都支持)