使用 Umeng进行App 自定义更新
2015-03-14 21:29
323 查看
写在前面
突然发现CSDN竟然有了MarkDown文本编辑器功能,很开心,一定要学习学习。好了,下面言归正传。这篇博文将解释我在项目中遇到的两个问题:
如何做到APP强制更新(不能取消)如何才能做到不同环境在不同地方(umeng)更新apk
1. 实现APP强制更新
需求是如何才能使用Umeng的更新功能在自己的应用中实现强制更新APP的功能?开始的时候我以为引入Umeng开发者中心提供的那几行代码就能把问题给解决掉,但是在转测时碰到各种各样的问题,就是启动Activity后再开启Umeng自动更新开关。但是不提示对话框(只有点返回键再进入才提示)。
原因就是我们那段代码是在MainActivity的onCreate()中写的,而项目中在只有在点击返回键时这个Activity才销毁。 很自然地我们想到把这一段代码写到onResume()中,虽然是切换到MainActivity中,能够解决掉这个问题,但是我们点击返回键时(应用切换到后台了),那个dialog却停留在手机桌面上。
这个dialog是个Activity,我们不能控制随着我们的Activity销毁而销毁。
最近两天有了一些思路,这个dialog自己从代码中创建,引用Umeng的布局和样式,然后使用Umeng官方提供的下载和更新方法。 同时为了在进入MainActivity后就必须更新,点击返回键直接把应用切到后台。我们必须让dialog跟随MainActivity消失而消失。也很简单,就是给dialog设置一个监听事件。
代码如下
UmengUpdateAgent.setUpdateAutoPopup(false); UmengUpdateAgent.setAppkey(CommonUtil.getAppKey(this)); UmengUpdateAgent.setUpdateOnlyWifi(false); UmengUpdateAgent.setDeltaUpdate(false); // 全量更新 UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() { @Override public void onUpdateReturned(int updateStatus, UpdateResponse updateInfo) { switch (updateStatus) { // 有更新 case UpdateStatus.Yes: showUpdateDialog(updateInfo); break; } } }); private void showUpdateDialog(UpdateResponse updateInfo) { //如果版本已经被忽略,不弹框 if (UmengUpdateAgent.isIgnore(this, updateInfo)) { return; } //获取下载完的文件,如果未下载则为null final File file = UmengUpdateAgent.downloadedFile(this, updateInfo); boolean isDownloaded = file != null; //创建更新对话框 createDialog(updateInfo, isDownloaded, file).show(); } /** * 创建更新对话框 * @param updateInfo 更新信息 * @param isDownloaded 是否已经下载 * @param file 下载完的文件,如果未下载为null * @return 更新对话框 */ private Dialog createDialog(final UpdateResponse updateInfo, boolean isDownloaded, final File file) { final boolean[] isIgnore = { false }; final int[] result = { UpdateStatus.NotNow }; final Context context = this; // 如果您的应用是全屏的,可以在这里设置Dialog也为全屏 final Dialog dialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar); View v = LayoutInflater.from(context).inflate(R.layout.umeng_update_dialog, null); // 忽略勾选框的状态回调 OnCheckedChangeListener cl = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { isIgnore[0] = isChecked; } }; // 点击回调,记录用户的不同选择 OnClickListener ll = new OnClickListener() { @Override public void onClick(View v) { if (R.id.umeng_update_id_ok == v.getId()) { result[0] = UpdateStatus.Update; } else if (R.id.umeng_update_id_ignore == v.getId()) { result[0] = UpdateStatus.Ignore; } else if (isIgnore[0]) { result[0] = UpdateStatus.Ignore; } dialog.dismiss(); } }; // 对话框消失回调,处理用户的不同选择 dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { switch (result[0]) { case UpdateStatus.Update: // 用户选择更新 if (file == null) { //开始下载 UmengUpdateAgent.startDownload(context, updateInfo); } else { //开始安装 UmengUpdateAgent.startInstall(context, file); } break; case UpdateStatus.Ignore: // 用户选择忽略 UmengUpdateAgent.ignoreUpdate(context, updateInfo); break; case UpdateStatus.NotNow: // 用户选择取消 break; } } }); // 获得网络连接服务 ConnectivityManager connManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); // 获取WIFI网络连接状态 State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) .getState(); // 如果正在使用WIFI网络或已经下载完成不显示无Wifi的图标 int visibility = (State.CONNECTED == state) || isDownloaded ? View.GONE : View.VISIBLE; v.findViewById(R.id.umeng_update_wifi_indicator).setVisibility( visibility); v.findViewById(R.id.umeng_update_id_ok).setOnClickListener(ll); v.findViewById(R.id.umeng_update_id_cancel).setOnClickListener(ll); v.findViewById(R.id.umeng_update_id_ignore).setOnClickListener(ll); v.findViewById(R.id.umeng_update_id_close).setOnClickListener(ll); ((CheckBox) v.findViewById(R.id.umeng_update_id_check)) .setOnCheckedChangeListener(cl); // 设置对话框显示文本 String content = updateContentString(updateInfo, isDownloaded); TextView tv = (TextView) v.findViewById(R.id.umeng_update_content); tv.requestFocus(); tv.setText(content); dialog.setContentView(v); **// 在dialog显示时,点击返回键时,让dialog与Activity一起消失** dialog.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { dialog.dismiss(); MainActivity.this.finish(); return true; } else { return false; } } }); return dialog; } /** * 根据更新信息编排对话框显示文本 * * @param updateInfo * 更新信息 * @param isDownloaded * 是否已经下载 * @return 更新对话框显示文本 */ public String updateContentString(UpdateResponse updateInfo, boolean isDownloaded) { String versionPrefix = getString(R.string.UMNewVersion); String sizePrefix = getString(R.string.UMTargetSize); String deltaPrefix = getString(R.string.UMUpdateSize); String updateLogPrefix = getString(R.string.UMUpdateContent); String installApk = getString(R.string.UMDialog_InstallAPK); // 已经下载的情况 if (isDownloaded) { return String.format("%s %s\n" + "%s\n\n" + "%s\n" + "%s\n", versionPrefix, updateInfo.version, installApk, updateLogPrefix, updateInfo.updateLog); } String deltaContent; // 增量更新和全量更新的情况 if (updateInfo.delta) { deltaContent = String.format("\n%s %s", deltaPrefix, CommonUtil.getFileSizeDescription(updateInfo.size)); } else { deltaContent = ""; } // 未下载的情况 return String.format("%s %s\n" + "%s %s%s\n\n" + "%s\n" + "%s\n", versionPrefix, updateInfo.version, sizePrefix, CommonUtil.getFileSizeDescription(updateInfo.target_size), deltaContent, updateLogPrefix, updateInfo.updateLog); }
声明:上面代码并非个人原创,自己参考了网上的一些内容,并加以修改适合项目需求。 我们还是要多看Umeng官方提供的文档和demo。
2. 实现不同的环境到不同的Umeng更新apk
这实际是很简单的,自己如果在想在测试环境更新上线环境的apk,那么可以再申请一个Umeng帐号,获取一个key,在代码中通过标记位控制让它们到不同Umeng帐号下去下载apk文件。希望上面内容对大家有所帮助~
reference:
[Umeng 官方文档]
相关文章推荐
- 使用 Umeng进行App 自定义更新
- 使用友盟进行app的增量更新
- 提交至APP STORE的APP和APP更新必须使用Xcode5.1.1(或更高级版本)及ios 7 sdk进行构建
- App强制更新时,点击进行下载的逻辑,分为调用原生浏览器下载和自定义显示进度条下载两种
- 使用AppWidget进行广播更新
- 使用用户自定义函数进行自定义查询
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
- asp.net ajax 使用updatepanel进行更新后的提示
- asp.net ajax 使用updatepanel进行更新后的提示
- [转]PHP之中使用共享内存进行高速数据更新的一种方案
- Excel中使用了自定义函数的单元格自动更新
- FC4初步使用体验--fox进行更新,添加官方安装指南
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- [转]PHP之中使用共享内存进行高速数据更新的一种方案
- 使用网络摄像头进行人脸跟踪(网站已恢复和更新)
- 对MSsqlServer的view使用insteadoftrigger进行视图更新
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测 推荐
- Effective C# 原则29:仅在对基类进行强制更新时才使用new修饰符(译)
- 从 SQL 进行操作系统调用,DB2自定义函数的使用
- 在Asp.Net里使用自定义映射进行重定向