本文主要简单讲解下安卓app如何进行版本更新
安卓版本更新不仅仅要在安卓端进行代码书写,还要后台人员的帮助!
首先将一个新的apk和一个txt文本给后台,让他放到先上去,可以用局域网测试,apk是你最新版的apk也就是你更新的时候会下载的这个apk,而txt文本则需要在里面加一段内容:
XXX&1.2.1&这里写点描述&http://192.168.0.11/php/versionAndroid/abc.apk 这里的XXX不需要管它,&是分隔符不可缺少,1.2.1是你的版本号,在后面是你对此次版本跟新的描述,最后的链接是可以下载apk的链接,即你给后台人员的那个apk,后台的这一切做好之后就看我们安卓端了!
废话不多说,看代码:
public class GetServerUrl{ static String url="http://192.168.0.11/php/versionAndroid"; public static String getUrl() { return url; } }此处获取服务器IP地址我这里用的是局域网测试
然后再新建一个实体类
public class UpdateInfo { private String version; private String description; private String url; public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }url、描述和版本号
然后我们通过读txt文本的内容来获取版本跟新需要一个工具类
public class UpdateInfoService { public UpdateInfoService(Context context) { } public UpdateInfo getUpDateInfo() throws Exception { String path = GetServerUrl.getUrl() + "/dashu.txt"; StringBuffer sb = new StringBuffer(); String line = null; BufferedReader reader = null; try { // 创建一个url对象 URL url = new URL(path); // 通過url对象,创建一个HttpURLConnection对象(连接) HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); // 通过HttpURLConnection对象,得到InputStream reader = new BufferedReader(new InputStreamReader( urlConnection.getInputStream())); // 使用io流读取文件 while ((line = reader.readLine()) != null) { sb.append(line); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (Exception e) { e.printStackTrace(); } } String info = sb.toString(); UpdateInfo updateInfo = new UpdateInfo(); updateInfo.setVersion(info.split("&")[1]); updateInfo.setDescription(info.split("&")[2]); updateInfo.setUrl(info.split("&")[3]); return updateInfo; } }准备工作都做好了,然后我的思路是在进入页面时,检测是否有新版本
代码如下:
public class MainActivity extends Activity { // 更新版本要用到的一些信息 private UpdateInfo info; private ProgressDialog pBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this, "正在检查版本更新..", Toast.LENGTH_SHORT).show(); // 自动检查有没有新版本 如果有新版本就提示更新 new Thread() { public void run() { try { UpdateInfoService updateInfoService = new UpdateInfoService( MainActivity.this); info = updateInfoService.getUpDateInfo(); handler1.sendEmptyMessage(0); } catch (Exception e) { e.printStackTrace(); } }; }.start(); } @SuppressLint("HandlerLeak") private Handler handler1 = new Handler() { public void handleMessage(Message msg) { // 如果有更新就提示 if (isNeedUpdate()) { showUpdateDialog(); } }; }; private void showUpdateDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle("有新版本" + info.getVersion()); builder.setMessage(info.getDescription()); builder.setCancelable(false); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { downFile(info.getUrl()); } else { Toast.makeText(MainActivity.this, "SD卡不可用,请插入SD卡", Toast.LENGTH_SHORT).show(); } } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.create().show(); } private boolean isNeedUpdate() { String v = info.getVersion(); // 最新版本的版本号 Log.i("update",v); Toast.makeText(MainActivity.this, v, Toast.LENGTH_SHORT).show(); if (v.equals(getVersion())) { return false; } else { return true; } } // 获取当前版本的版本号 private String getVersion() { try { PackageManager packageManager = getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo( getPackageName(), 0); Log.d("TAK","packageInfo.versionName"+packageInfo.versionName); return packageInfo.versionName; } catch (NameNotFoundException e) { e.printStackTrace(); return "版本号未知"; } } void downFile(final String url) { Log.d("TSK","url"+url); pBar = new ProgressDialog(MainActivity.this); //进度条,在下载的时候实时更新进度,提高用户友好度 pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pBar.setTitle("正在下载"); pBar.setMessage("请稍候..."); pBar.setProgress(0); pBar.show(); new Thread(new Runnable() { @Override public void run() { //Xutils3联网获取数据 RequestParams param = new RequestParams(url); param.setSaveFilePath(Environment.getExternalStorageDirectory()+"/abc/abc.apk"); x.http().get(param, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File file) { Log.d("TAG",file.toString()); down(); } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } @Override public void onWaiting() { } @Override public void onStarted() { } @Override public void onLoading(long total, long current, boolean isDownloading) { pBar.setMax((int) total); pBar.setProgress((int) current); } }); } }).start(); } void down() { handler1.post(new Runnable() { public void run() { pBar.cancel(); update(); } }); } void update() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory()+"/abc", "abc.apk")), "application/vnd.android.package-archive"); startActivity(intent); } }我这里用的是Xutil3获取网络数据,当然你们也可以用OkHttp或者其它网络框架
项目地址:(http://download.csdn.net/detail/zhangzibin1992/9756861)
有不明白的可在底下留言