UpdateInfo

public class UpdateInfo {
public String version;//服务器的最新版本值
public String apkUrl;//最新版本的路径
public String desc;//版本更新细节
}

WelcomeActivity:

 public class WelcomeActivity extends Activity {

     private static final int TO_MAIN = ;
private static final int DOWNLOAD_VERSION_SUCCESS = ;
private static final int DOWNLOAD_APK_FAIL = ;
private static final int DOWNLOAD_APK_SUCCESS = ;
@Bind(R.id.iv_welcome_icon)
ImageView ivWelcomeIcon;
@Bind(R.id.rl_welcome)
RelativeLayout rlWelcome;
@Bind(R.id.tv_welcome_version)
TextView tvWelcomeVersion;
private boolean connect;
private long startTime; private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TO_MAIN:
finish();
startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
break;
case DOWNLOAD_VERSION_SUCCESS:
//获取当前应用的版本信息
String version = getVersion();
//更新页面显示的版本信息
tvWelcomeVersion.setText(version);
//比较服务器获取的最新的版本跟本应用的版本是否一致
if(version.equals(updateInfo.version)){
UIUtils.toast("当前应用已经是最新版本",false);
toMain();
}else{
new AlertDialog.Builder(WelcomeActivity.this)
.setTitle("下载最新版本")
.setMessage(updateInfo.desc)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//下载服务器保存的应用数据
downloadApk();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
toMain();
}
})
.show();
} break;
case DOWNLOAD_APK_FAIL:
UIUtils.toast("联网下载数据失败",false);
toMain();
break;
case DOWNLOAD_APK_SUCCESS:
UIUtils.toast("下载应用数据成功",false);
dialog.dismiss();
installApk();//安装下载好的应用
finish();//结束当前的welcomeActivity的显示
break;
} }
}; private void installApk() {
Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
intent.setData(Uri.parse("file:" + apkFile.getAbsolutePath()));
startActivity(intent);
} private ProgressDialog dialog;
private File apkFile;
private void downloadApk() {
//初始化水平进度条的dialog
dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.show();
//初始化数据要保持的位置
File filesDir;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
filesDir = this.getExternalFilesDir("");
}else{
filesDir = this.getFilesDir();
}
apkFile = new File(filesDir,"update.apk"); //启动一个分线程联网下载数据:
new Thread(){
public void run(){
String path = updateInfo.apkUrl;
InputStream is = null;
FileOutputStream fos = null;
HttpURLConnection conn = null;
try {
URL url = new URL(path);
conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET");
conn.setConnectTimeout();
conn.setReadTimeout(); conn.connect(); if(conn.getResponseCode() == ){
dialog.setMax(conn.getContentLength());//设置dialog的最大值
is = conn.getInputStream();
fos = new FileOutputStream(apkFile); byte[] buffer = new byte[];
int len;
while((len = is.read(buffer)) != -){
//更新dialog的进度
dialog.incrementProgressBy(len);
fos.write(buffer,,len); SystemClock.sleep();
} handler.sendEmptyMessage(DOWNLOAD_APK_SUCCESS); }else{
handler.sendEmptyMessage(DOWNLOAD_APK_FAIL); } } catch (Exception e) {
e.printStackTrace();
}finally{
if(conn != null){
conn.disconnect();
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
}.start(); } private UpdateInfo updateInfo; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 去掉窗口标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 隐藏顶部的状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_welcome);
ButterKnife.bind(this); //将当前的activity添加到ActivityManager中
ActivityManager.getInstance().add(this);
//提供启动动画
setAnimation(); //联网更新应用
updateApkFile(); } /**
* 当前版本号
*
* @return
*/
private String getVersion() {
String version = "未知版本";
PackageManager manager = getPackageManager();
try {
PackageInfo packageInfo = manager.getPackageInfo(getPackageName(), );
version = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
//e.printStackTrace(); //如果找不到对应的应用包信息, 就返回"未知版本"
}
return version;
} private void updateApkFile() {
//获取系统当前时间
startTime = System.currentTimeMillis(); //1.判断手机是否可以联网
boolean connect = isConnect();
if (!connect) {//没有移动网络
UIUtils.toast("当前没有移动数据网络", false);
toMain();
} else {//有移动网络
//联网获取服务器的最新版本数据
AsyncHttpClient client = new AsyncHttpClient();
String url = AppNetConfig.UPDATE;
client.post(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String content) {
//解析json数据
updateInfo = JSON.parseObject(content, UpdateInfo.class);
handler.sendEmptyMessage(DOWNLOAD_VERSION_SUCCESS);
} @Override
public void onFailure(Throwable error, String content) {
UIUtils.toast("联网请求数据失败", false);
toMain();
}
}); }
} private void toMain() {
long currentTime = System.currentTimeMillis();
long delayTime = - (currentTime - startTime);
if (delayTime < ) {
delayTime = ;
} handler.sendEmptyMessageDelayed(TO_MAIN, delayTime);
} private void setAnimation() {
AlphaAnimation alphaAnimation = new AlphaAnimation(, );//0:完全透明 1:完全不透明
alphaAnimation.setDuration();
alphaAnimation.setInterpolator(new AccelerateInterpolator());//设置动画的变化率 //方式一:
// alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
// @Override
// public void onAnimationStart(Animation animation) {
//
// }
// //当动画结束时:调用如下方法
// @Override
// public void onAnimationEnd(Animation animation) {
// Intent intent = new Intent(WelcomeActivity.this,MainActivity.class);
// startActivity(intent);
// finish();//销毁当前页面
// }
//
// @Override
// public void onAnimationRepeat(Animation animation) {
//
// }
// });
//方式二:使用handler
// handler.postDelayed(new Runnable() {
// @Override
// public void run() {
// Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
// startActivity(intent);
//// finish();//销毁当前页面
// //结束activity的显示,并从栈空间中移除
// ActivityManager.getInstance().remove(WelcomeActivity.this);
// }
// }, 3000); //启动动画
rlWelcome.startAnimation(alphaAnimation); } public boolean isConnect() {
boolean connected = false; ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null) {
connected = networkInfo.isConnected();
}
return connected;
}
}

Android联网更新应用的更多相关文章

  1. android studio 更新 Gradle错误解决方法(Gradle sync failed)

    android studio 更新 Gradle错误解决方法   Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. fir.im Weekly - iOS / Android 动态化更新方案盘点

    动态化更新是 App 开发必然面对的问题.在 iOS 环境下,Apple 开发者们像是" 带着手铐脚镣跳舞" ,相比之下 Android 开发者会轻松一点,有很多相关的开源框架帮助 ...

  6. [转]Android SDK更新 Connection to http://dl-ssl.google.com refused 解决方法

    问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository ...

  7. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  8. Android 增量更新(BSDiff / bspatch)

    Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...

  9. Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

随机推荐

  1. MSTP-多生成树协议

    多生成树协议MSTP(Multiple Spanning Tree Protocol)是IEEE 802.1s中定义的一种新型生成树协议.简单说来,STP/RSTP是基于端口的,PVST+是基于VLA ...

  2. ElasticSearch 工具类封装(基于ElasticsearchTemplate)

    1.抽象接口定义 public abstract class SearchQueryEngine<T> { @Autowired protected ElasticsearchTempla ...

  3. .NET 动态向Word文档添加数据

    本文章主要用于在网页上填写数据动态填入Word模板中使用 首先要准备一个Word模板,然后在需要插入数据的位置插入书签,这样可以确定在网页上填入的数据可以插入到Word文档相应的位置. 在项目中要声明 ...

  4. ThreadLocal父子线程传递实现方案

    介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:ThreadLocal源码分析解密.在讲解之前我们先列 ...

  5. salesforce lightning零基础学习(六)Lightning Data Service(LDS)

    本篇可参看:https://trailhead.salesforce.com/modules/lightning_data_service Lightning中针对object的detail页面,一个 ...

  6. jq的ajax交互封装

    jq封装的ajax,然后 在此前和此后都是很多要考虑的  ,何不 想想构思封装下. 下面: 基本上网页都存在各种ajax,使得网页变得更加易于操作. 举个长长的例子吧: <input type= ...

  7. 从零开始学 Web 之 JavaScript(三)函数

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  8. 详解C#异常处理

    一.程序运行时产生的错误通过使用一种称为异常(Exception)的机制在程序中传递,通过异常处理(Exception Handling)有助于处理程序运行过程中发生的意外或异常情况:异常可由CLR和 ...

  9. 转:Bash Shell常用快捷键

    转载:原文出处 移动光标 ctrl+b: 前移一个字符(backward) ctrl+f: 后移一个字符(forward) alt+b: 前移一个单词 alt+f: 后移一个单词 ctrl+a: 移到 ...

  10. Notyf - 超级简单、响应式的 JS 通知插件

    通知是网站的常用功能之一,可以用来显示消息.通告.提示等等.Notyf 是一款超级简单.响应式的 JS 通知插件,不依赖 jQuery 库,可以独立使用.赶紧试用一下吧! 在线演示      免费下载 ...