Android实战系列(一)---版本更新
来源:互联网 发布:qq空间刷留言软件 编辑:程序博客网 时间:2024/05/29 09:57
1、在启动页面里,在启动登录页面的同时,使用handler延迟0.2发送一个更新的广播(确保登录页面启动起来了啥)
LauncherGuide.java
AbsUI.startUI(context, LoginUI.class); handler.postDelayed(new Runnable() { @Override public void run() { EventBus.getDefault().post(new Stype(Constant.LOGIN_Urage)); } }, 200);
2、Constant.LOGIN_Urage,被Login.java注册了
Login{...onCreate(){EventBus.getDefault().register(this);}... @Subscribe public void onEventMainThread(Stype ev) { ... if (ev.getMsg() == Constant.LOGIN_Urage) { checkVersion(); } ... }}
如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行.继续往下看:版本更新的工具类。
UpgradeBean bean = new UpgradeBean(); bean.setTypeID("1"); callBackHandler=new AsyncCallBackHandler(ui,showText,isShowDialog,null) { @Override public void mySuccess(int arg0, Header[] arg1, String result) { Log.e(TAG, "onPostExecute():result:" + result); // 调用接口 if (adapter != null) { // 完成接口 adapter.onQueryCompleted(result); // 设置新版本 setNewVersion(adapter.getVersionNO()); //设置文件大小 setSize(adapter.getSize()); // 远程下载地址 setDownloadRemoteUri( adapter.getDownloadRemoteUri() ); Log.i(TAG, "adapter.getVersionNO()"+adapter.getVersionNO()); boolean bUpgrade = isUpgrade(appInfo.getVersionName()+"."+appInfo.getVersionCode(),adapter.getVersionNO()); // 更新事件接口 adapter.onUpgrade(bUpgrade, appInfo.getVersionName(),adapter.getVersionNO(), getDownloadRemoteUri(), getDownloadLocalPath(),getSize()); } } @Override public void myFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { Toast.makeText(ui, "网络异常", Toast.LENGTH_SHORT).show(); } }; try { AsyncHttpUtil.post(context, queryUri, bean, "application/json", callBackHandler); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
实际上是调用后台的版本更新的接口,使用AsyncHttpUtil封装的一步http网络post请求。
UpgradeBean会传递apk类型后台
public class UpgradeBean { private String typeID ;//APP类型1安卓2IOS public String getTypeID() { return typeID; } public void setTypeID(String typeID) { this.typeID = typeID; }}
Adapter是个接口
public interface Adapter { // 请求完成 abstract void onQueryCompleted(String result); // http错误 abstract void onHttpFailed(Error error, java.lang.Exception exception, int responseCode, byte[] out); // 获取最新版本号 abstract String getVersionNO(); //文件大小 abstract String getSize(); // 更新事件 abstract void onUpgrade(boolean upgrade, String oldVersion, String newVersion, String downloadRemoteUri, String downloadLocalPath,String size); // 获取下载地址 abstract String getDownloadRemoteUri(); void onHttpFailed(java.lang.Error error, Exception exception, int responseCode, byte[] out); }
重点关心于是否更新,更新的实现,先看下服务端返回的数据结构
public class UpgradeMessageBean { private String msg; private int statu; private UpgradeMessage model; public class UpgradeMessage{ private String VersionLink; private String VersionNo;// V1.1.0.0 }
public void onUpgrade(boolean upgrade, String oldVersion, String newVersion, String downloadRemoteUri, String downloadLocalPath,String size) { if (upgrade) {//比较手机和接口返回的版本 UpgradeNotificationBean notificationBean = new UpgradeNotificationBean(); notificationBean.setTitle(context.getResources().getString(R.string.app_name)); notificationBean.setOldVersion(oldVersion); notificationBean.setNewVersion(newVersion); notificationBean.setDownloadRemoteUri(downloadRemoteUri); notificationBean.setDownloadLocalPath(downloadLocalPath); notificationBean.setSize(size); UpgradeDialog upgradeDialogF = new UpgradeDialog(ui);//这里的ui不能改为context,必须为界面 upgradeDialogF.setTitle("版本更新"); upgradeDialogF.setContent(context.getResources().getString(R.string.app_name)+"新版发布(v"+newVersion+")"); upgradeDialogF.setTaskBean(taskBean); upgradeDialogF.setNotificationBean(notificationBean); if (!ui.isFinishing()) { upgradeDialogF.show(); }else { Log.i(TAG, "ui.isFinishing()="+ui.isFinishing()); } }else{ } }
upgradeDialogF对话框弹出后(版本不一致),有确定取消两个按钮
btn_upgrade_sure.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (notificationBean != null) { if (new NetworkState(context).isConnected() == false) { Toast.makeText(context, "无网络连接", Toast.LENGTH_SHORT).show(); return; } if (!UpgradeTaskUtil.isCanDownload) { Toast.makeText(context, "没有存储卡,不能下载新版本", Toast.LENGTH_SHORT).show(); UpgradeDialog.this.dismiss(); return; } // 下载并且更新应用 UpgradeTask task = new UpgradeTask((android.support.v4.app.FragmentActivity)context); if (notificationBean != null) { task.setTitle( notificationBean.getTitle() ); task.setDownloadRemoteUri(notificationBean.getDownloadRemoteUri()); task.setDownloadLocalPath(notificationBean.getDownloadLocalPath()); task.download(); } // 关闭自身窗口 UpgradeDialog.this.dismiss(); }else{ Log.e(TAG, "notificationBean == null"); } } }); //下次再说 btn_upgrade_cancle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new Stype(Constant.LOGIN_UI)); UpgradeDialog.this.dismiss(); } });
取消的话会给LoginUI发个广播,说哥们不更新直接登录就好了。
确定下载的话
则:
new Thread(){ public void run(){ try { URL url = new URL(downloadRemoteUri); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setConnectTimeout(5*1000); Message msg = Message.obtain(); msg.arg1 = connection.getResponseCode(); msg.what = MSG_RESPONDECODE; handler.sendMessage(msg); } catch (Exception e) { Log.i(TAG, "url 不可用=="+downloadRemoteUri); handler.sendEmptyMessage(MSG_NO_FILE); } } }.start();
如果url不可用(404)则发MSG_NO_FILE,可用则把网络请求的的返回code保存起来,同时发送MSG_RESPONDECODE广播,
if(msg.arg1==200){ downloadManager }
通过内置的DownloadManager下载。
总结:
1、在软件启动后发送版本更新的广播,设定soap请求的参数。
2、对返回的版本号、url进行核对,版本一致,不提示用户下载,版本不一致,弹框提示用户。
3、用户决定下载,如果url正确可用(httpUrlconnect),则用Android内置的DownloadManager下载,否则提示文件不存在。(ACTION_PACKAGE_REPLACED、ACTION_DOWNLOAD_COMPLETE、ACTION_PACKAGE_ADDED)可以监听
- Android实战系列(一)---版本更新
- (android实战)应用在线版本更新
- Android实战之app版本更新升级全文章(一)
- android开发实战系列(14)-- 不同平台版本支持
- Android 实战-版本更新(okhttp3、service、notification)
- Jersey 实战系列(一)
- redis 实战系列(一)
- UNet实战系列(一)
- UNet实战系列(一)
- Django实战系列(一)
- Android实战之app版本更新升级全文章(二)
- Android实战之app版本更新升级全文章(三)
- Android中实现版本更新(一)使用第三方sdk更新
- Android 版本更新(1)
- Git实战(一)版本控制概述
- Android系列(一)
- Android Fragment 实战(一)
- 系列WAPPUSH代码-更新版本
- 设置Flume监听文件内容
- AIX的inittab分析报告
- http请求获取跳转后URL JAVA
- StarUML for MAC 破解方法
- 最大子序列和
- Android实战系列(一)---版本更新
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
- EJB深度剖析,写的蛮好的,拿来借鉴一下
- oracle的sql操作
- 黑白棋的基础程序
- leetcode Unique Binary Search Trees
- 一个完整的软件项目开发流程
- springmvc常用注解
- (转)Android 代码设置 控件背景颜色