Android检查更新(是否强制更新)
来源:互联网 发布:上班拼车用什么软件 编辑:程序博客网 时间:2024/04/27 17:18
Android应用客户端通常会需要更新,而且根据需求分为普通更新和强制更新。是否强制更新可通过检查更新时从服务器获取的标志位来判断。
public class UpdateManager { private Context mContext; //上下文 private String apkUrl = "http://183.232.83.10/dd.myapp.com/16891/" + "C4F9FF39FAE9184222DC278DC7309611.apk?mkey" + "=5541c92b6a9cca8d&f=d388&fsname=com.yangmbin" + ".beauty_1.1_2.apk&asr=8eff&p=.apk"; //apk下载地址 private static final String savePath = "/sdcard/updateAPK/"; //apk保存到SD卡的路径 private static final String saveFileName = savePath + "apkName.apk"; //完整路径名 private ProgressBar mProgress; //下载进度条控件 private static final int DOWNLOADING = 1; //表示正在下载 private static final int DOWNLOADED = 2; //下载完毕 private static final int DOWNLOAD_FAILED = 3; //下载失败 private int progress; //下载进度 private boolean cancelFlag = false; //取消下载标志位 private double serverVersion = 2.0; //从服务器获取的版本号 private double clientVersion = 1.0; //客户端当前的版本号 private String updateDescription = "更新描述"; //更新内容描述信息 private boolean forceUpdate = true; //是否强制更新 private AlertDialog alertDialog1, alertDialog2; //表示提示对话框、进度条对话框 /** 构造函数 */ public UpdateManager(Context context) { this.mContext = context; } /** 显示更新对话框 */ public void showNoticeDialog() { //如果版本最新,则不需要更新 if (serverVersion <= clientVersion) return; AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); dialog.setTitle("发现新版本 :" + serverVersion); dialog.setMessage(updateDescription); dialog.setPositiveButton("现在更新", new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub arg0.dismiss(); showDownloadDialog(); } }); //是否强制更新 if (forceUpdate == false) { dialog.setNegativeButton("待会更新", new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub arg0.dismiss(); } }); } alertDialog1 = dialog.create(); alertDialog1.setCancelable(false); alertDialog1.show(); } /** 显示进度条对话框 */ public void showDownloadDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); dialog.setTitle("正在更新"); final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.softupdate_progress, null); mProgress = (ProgressBar) v.findViewById(R.id.update_progress); dialog.setView(v); //如果是强制更新,则不显示取消按钮 if (forceUpdate == false) { dialog.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub arg0.dismiss(); cancelFlag = false; } }); } alertDialog2 = dialog.create(); alertDialog2.setCancelable(false); alertDialog2.show(); //下载apk downloadAPK(); } /** 下载apk的线程 */ public void downloadAPK() { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub 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(DOWNLOADING); if(numread <= 0){ //下载完成通知安装 mHandler.sendEmptyMessage(DOWNLOADED); break; } fos.write(buf, 0, numread); }while(!cancelFlag); //点击取消就停止下载. fos.close(); is.close(); } catch(Exception e) { mHandler.sendEmptyMessage(DOWNLOAD_FAILED); e.printStackTrace(); } } }).start(); } /** 更新UI的handler */ private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case DOWNLOADING: mProgress.setProgress(progress); break; case DOWNLOADED: if (alertDialog2 != null) alertDialog2.dismiss(); installAPK(); break; case DOWNLOAD_FAILED: Toast.makeText(mContext, "网络断开,请稍候再试", Toast.LENGTH_LONG).show(); break; default: break; } } }; /** 下载完成后自动安装apk */ public void installAPK() { File apkFile = new File(saveFileName); if (!apkFile.exists()) { return; } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(intent); }}
对话框中进度条用到的布局:softupdate_progress.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ProgressBar android:id="@+id/update_progress" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" style="?android:attr/progressBarStyleHorizontal" /></RelativeLayout>
使用方法:
//这里来检测版本是否需要更新 mUpdateManager = new UpdateManager(this); mUpdateManager.showNoticeDialog();
检查更新通常是在初始化的时候,请求服务器检查版本,如果有更新,则把相关url、是否强制更新和版本号等信息通过showNoticeDialog的参数传递进去,做相关的初始化即可。
0 0
- Android检查更新(是否强制更新)
- Android检查更新(是否强制更新)
- android检查更新(强制更新)
- android 检查软件是否有更新版本
- android强制更新APK
- 检查版本是否需要更新
- android程序检查更新
- Android检查更新
- Android检查版本更新
- Android检查版本更新
- Android应用强制更新策略
- Android的APP强制更新
- android,检查更新,版本更新,自动更新
- iOS 程序检查是否有更新
- Android 检查更新 下载 安装
- Android应用检查更新总结
- Android检查更新下载安装
- Android检查更新下载安装
- Find Through Association 通过级联查找
- android studio 项目转换成eclipse工程
- Fragment的详解
- junit4入门
- Android Handler、Looper、Message Queue理解
- Android检查更新(是否强制更新)
- Rank Scores
- 开发支持多显示器的Windows程序,挺全的
- iNOC产品部-杨辉三角的变形
- 初入IT行业
- android.view.InflateException: Binary XML file line
- openstack neutron(tap、qvb、qvo详解)(转)
- mark 我的第一篇博文
- UVA - 10183 - How Many Fibs? (斐波那契 + 高精度)