Android 版本更新
2016-01-07 11:18
337 查看
1、添加权限
2、写一个工具类方法,UpdateManager.java,说明写的够详细了,易理解,弹出框为我自定义的。
3、写一个检测是否有新版本的类,CheckUpdateManager.java
首页需调用的方法检测版本更新
点击打开链接
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
2、写一个工具类方法,UpdateManager.java,说明写的够详细了,易理解,弹出框为我自定义的。
public class UpdateManager { private Context mContext; /*安装提示语*/ private String updateMsg = "有最新的软件包哦,亲快下载吧~"; /*安装包URL*/ private String apkUrl; /* 下载包安装路径 */ private static final String savePath = "/sdcard/updatedownload/"; /*下载包名字*/ private static final String saveFileName = savePath.trim() + "sunday.apk".trim(); /* 进度条与通知ui刷新的handler和msg常量 */ private ProgressBar mProgress; /*下载进度*/ private static final int DOWN_UPDATE = 1; /*下载完成*/ private static final int DOWN_OVER = 2; /*用于更新下载的进度*/ private int progress; /* 下载APK的线程 */ private Thread downLoadThread; /* 新版本更新内容 */ private String message; /* 最新版本的版本号 */ private String lastVersion; private boolean interceptFlag = false; /** * handler通知 */ private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case DOWN_UPDATE: mProgress.setProgress(progress);//下载进度 break; case DOWN_OVER: installApk();//下载完成,进行安装APK break; default: break; } } ; }; /** * @param apkUrl * 软件URL * @param message * 软件升级日志(有哪些功能更新) * @param lastVersion * 升级的最新版本 * @Description: TODO * @author Sunday * @date 2016年1月6日 */ public UpdateManager(Context context, String apkUrl, String message, String lastVersion) { this.mContext = context; this.apkUrl = apkUrl; this.message = message; this.lastVersion = lastVersion; } /** * * @Description: TODO 外部接口让主Activity调用 * @author Sunday * @date 2016年1月7日 */ public void checkUpdateInfo() { showNoticeDialog(); } /** * * @Description: TODO 升级提示对话框 * @author Sunday * @date 2016年1月6日 */ private void showNoticeDialog() { final CommonDialog commonDialog = new CommonDialog(mContext); commonDialog.show(); commonDialog.setCancel(true, "检测到您有新的版本可以更新" + lastVersion); commonDialog.setUpdateMessage(message); commonDialog.setCanceledOnTouchOutside(false); commonDialog.setDialog_cancel_text("稍后更新"); commonDialog.setDialog_ok_text("立即更新"); commonDialog.setBtnOnClick(new OnClickListener() { @Override public void onClick(View v) { showDownloadDialog(); commonDialog.dismiss(); } }); } /** * * @Description: TODO 显示下载进度对话框 * @author Sunday * @date 2016年1月6日 */ private void showDownloadDialog() { final CommonDialog commonDialog = new CommonDialog(mContext); commonDialog.show(); mProgress = commonDialog.getmProgressBar(); commonDialog.showProgress(); commonDialog.goneTv_message(); commonDialog.setDialog_ok_text("取消"); commonDialog.setCancelable(false); commonDialog.setCanceledOnTouchOutside(false); commonDialog.setCancel(false, "正在为您下载最新版本"); commonDialog.setBtnOnClick(new OnClickListener() { @Override public void onClick(View v) { commonDialog.dismiss(); interceptFlag = true; } }); 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(); } } }; /** * * @Description: TODO 进行下载APK * @author Sunday * @date 2016年1月7日 */ private void downloadApk() { downLoadThread = new Thread(mdownApkRunnable); downLoadThread.start(); } /** * * @Description: TODO 进行安装APK * @author Sunday * @date 2016年1月7日 */ private void installApk() { File apkfile = new File(saveFileName); if (!apkfile.exists()) { return; } Intent i = new Intent(Intent.ACTION_VIEW); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(i); } }
3、写一个检测是否有新版本的类,CheckUpdateManager.java
public class CheckUpdateManager implements ICallBackJson { private Context context; private WebHttpConnection webHttpConnection; private VersionEntity app; /* 判断是否是从首页调用该方法 */ private int flag; public CheckUpdateManager(Context context, int flag) { this.context = context; webHttpConnection = new WebHttpConnection(this); this.flag = flag; } /** * * @Description: TODO 访问网络接口,获得服务器端App版本 * @param * @return void * @throws * @author Sunday * @date 2016年1月6日 */ public void checkVersion() { webHttpConnection.getValue(ApiHttpAddress.UPDATA_VERSION, 1); } /** * * @Description: TODO 进行更新版本 * @param @param app * @return void * @throws * @author Sunday * @date 2016年1月7日 */ protected void UpdateVersion(VersionEntity app) { if (null == app) { return; } PackageManager pm = context.getPackageManager(); PackageInfo pinfo = null; try { pinfo = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS); } catch (NameNotFoundException e) { e.printStackTrace(); } int versionCode = pinfo.versionCode; Log.e("服务器版本", app.getVersion()); Log.e("本机版本", String.valueOf(versionCode)); if (Integer.parseInt(app.getVersion()) > versionCode) { UpdateManager mUpdateManager = new UpdateManager(context, app.getUrl(), "", ""); mUpdateManager.checkUpdateInfo(); } else { if (1 == flag) { Toast.makeText(context, "已经是最新版本", Toast.LENGTH_LONG).show(); } } } /* * 网络请求失败回调 */ @Override public void requestJsonOnError(int msgFlag) { // TODO Auto-generated method stub ((BaseActivity) context).cancelProgressDialog(); Log.e("msgFlag", String.valueOf(msgFlag)); } /* * 网络请求成功回调 */ @Override public void requestJsonOnSucceed(String json, int msgFlag) { // TODO Auto-generated method stub ((BaseActivity) context).cancelProgressDialog(); if (1 == msgFlag) { app = JSON.parseObject(json, VersionEntity.class); if (null != app) UpdateVersion(app); } } }
首页需调用的方法检测版本更新
void checkUpdate() { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub CheckUpdateManager mCheckUpdateManager = new CheckUpdateManager( mContext, 0); mCheckUpdateManager.checkVersion(); } }).start(); }
点击打开链接
相关文章推荐
- Android之TextView(控件)
- Android Fragment与activity交互方式
- Android View与GroupView原理以及其子类描述
- 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度
- Android 自定义标题栏背景
- Android的JS调用Java代码或使用了Javascript相关技术,混淆问题
- 更换android开机动画须选择好正确的压缩格式
- android-dev-com
- android-dev-cn
- Cordova编译Android 22 以上版本,中文目录出错问题的解决办法
- Android学习:自定义ViewGroup方法总结
- 160多个android开源代码汇总
- 4种Android获取View宽高的方式
- android sdk 版本与api对应
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android横竖屏总结
- Android Wear创建一个通知
- Android 原生加载框
- 高德地图 android 设置完全自定义的InfoWindow
- Activity和Service的交互