自动版本检测更新
2016-05-11 12:00
337 查看
主界面登录自动检查更新
checkupdateagent.addListener(checkUpDate); checkupdateagent.start();
Agent版本获取服务端版本信息
public class CheckUpdateAgent extends AbstractAgent<String> { public static final String KEY_VERSION = "version"; public static final String KEY_URL = "url"; public static String desc; private int sleepMiSec = 4000; public CheckUpdateAgent(){ this(3000); } public CheckUpdateAgent(int sleepMiSec){ this.sleepMiSec = sleepMiSec; } @Override protected String doExecute() throws HttpRPCException { try { new TimeFairy(sleepMiSec).sleepIfNecessary(); URL updateURL = new URL(AppUtil.getUpdateURL()); HttpURLConnection conn = (HttpURLConnection) updateURL.openConnection(); Properties props = new Properties(); props.load(conn.getInputStream()); String version = props.getProperty(KEY_VERSION); String url=null; if(AppUtil.shouldUpdateToNewVersion(version)){ url = props.getProperty(KEY_URL); desc=props.getProperty("desc"); } return url; } catch (Exception ex) { throw new HttpRPCException(ex.getMessage(), 0, ex); } } }
工具APPUtil,版本判断,
public static boolean shouldUpdateToNewVersion(String serverVersion) { String[] curVersions = versionName.split("[.]"); String[] serverVersions = serverVersion.split("[.]"); for (int i = 0; i < 3; i++) { int curVersion = Integer.parseInt(curVersions[i]); int servVersion = Integer.parseInt(serverVersions[i]); if (curVersion > servVersion) { return false; } else if (curVersion < servVersion) { return true; } } return false; }
监听返回
/** * 获取更新数据监听 */ private AgentListener<String> checkUpDate = new AgentListener<String>() { @Override public void onStarted(long seq) { } @Override public void onSucceeded(String info, long seq) { if(info!=null) { updateManager = new UpdateManager(MainAct.this, info); showUpDate(); } } @Override public void onFailed(String errMsg, int errCode, long seq) { ViewUtil.showToast("更新失败,请重使"); } };
弹窗更新与否
/** * 更新提示框 */ private void showUpDate() { AlertDialog.Builder builder = new AlertDialog.Builder(MainAct.this); builder.setMessage("检测到新版本,确认安装吗?"); builder.setTitle("更新信息"); builder.setPositiveButton("立刻安装", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); updateManager.checkUpdateInfo(); } }); builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); }
下载UpdateManager
下载完成自动安装
public class UpdateManager { /* 下载包安装路径 */ private static final String savePath = "/sdcard/yzxd/"; private static final String saveFileName = savePath + "yzxd.apk"; private Context mContext; //返回的安装包url private String apkUrl=""; private Dialog downloadDialog; /* 进度条与通知ui刷新的handler和msg常量 */ private ProgressBar mProgress; private static final int DOWN_UPDATE = 1; private static final int DOWN_OVER = 2; private int progress; private Thread downLoadThread; private boolean interceptFlag = false; private Handler mHandler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case DOWN_UPDATE: mProgress.setProgress(progress); break; case DOWN_OVER: downloadDialog.dismiss(); installApk(); break; default: break; } }; }; public UpdateManager(Context context, String apkUrl) { this.mContext = context; this.apkUrl=apkUrl; } //外部接口让主Activity调用 public void checkUpdateInfo(){ showDownloadDialog(); } private void showDownloadDialog(){ AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("正在下载更新"); final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.progress, null); mProgress = (ProgressBar)v.findViewById(R.id.progress); builder.setView(v); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); interceptFlag = true; } }); downloadDialog = builder.create(); downloadDialog.show(); downloadApk(); } private Runnable mdownApkRunnable = new Runnable() { @Override public void run() { try { URL url = new URL(apkUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.connect(); int length = conn.getContentLength(); InputStream is = conn.getInputStream(); File file = new File(savePath); if(!file.exists()){ file.mkdir(); } String apkFile = saveFileName; File ApkFile = new File(apkFile); FileOutputStream fos = new FileOutputStream(ApkFile); int count = 0; byte buf[] = new byte[1024]; do{ int numread = is.read(buf); count += numread; progress =(int)(((float)count / length) * 100); //更新进度 mHandler.sendEmptyMessage(DOWN_UPDATE); if(numread <= 0){ //下载完成通知安装 mHandler.sendEmptyMessage(DOWN_OVER); break; } fos.write(buf,0,numread); }while(!interceptFlag);//点击取消就停止下载. fos.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } }; /** * 下载apk * @param */ private void downloadApk(){ downLoadThread = new Thread(mdownApkRunnable); downLoadThread.start(); } /** * 安装apk * @param */ private void installApk(){ File apkfile = new File(saveFileName); if (!apkfile.exists()) { return; } Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(i); } }
相关文章推荐
- 详述执行map reduce 程序的步骤(本地执行MR、服务器上执行MR)
- api的接口系统问题总结
- 浏览器窗口关闭触发的事件
- 论开源<3>---从公司企业的高度看开源
- reequests快速入门
- iOS启动屏后再加个闪屏的方法
- 使用RouteDebugger对MVC路由进行调试
- Chapter 5. 集合---(ArrayList、Stack、queue、哈希表)
- poj1276Cash Machine(多重背包)
- WinForm中DataGridView折叠控件【超好看】
- iOS视频播放Demo VideoPlayerDemo
- magento2插件开发(1):magento2 Hello World
- java.lang.OutOfMemoryError: PermGen space
- iOS视频播放Demo VideoPlayerDemo
- 實際案例: 接口接入驗證 (公眾號設定)
- 转:【译】CSS3:clip-path详解
- Yii创建模板
- auto_ptr的使用
- 欢迎使用CSDN-markdown编辑器
- python 多行匹配