客户端:去服务器获取最新的版本信息

服务器端:

版本信息,最新的版本2.0

最新版本的下载地址:http://xxxxxxxx/mobilesafe2.0.apk

版本的描述信息

客户端如果不升级新版本就进入主界面,升级新版本就替换安装

服务器端json信息

{"version":"2.0","description":"发现新版本,下载送现金","apkurl":"http://100.66.221.69/mobilesafe2.0.apk"}

联网请求数据

把服务器的地址保存在一个配置文件里面,res/values/config.xml

<string name=”serverurl”>http://xxxxxxxxxxxxxxxx</string>

开启子线程检查版本信息

new Thread{}.start(),重写run方法

获取Url对象

new获取Url对象,捕获异常错误,获取配置信息数据getString(R.string.serverurl)

调用Url对象的openConnection()方法,获取HttpUrlConnection对象

调用它的各种方法获取到数据

更新界面&处理异常

解析JSON

获取JSONObject对象,通过new JSONObject(string)构造方法

调用JSONObject对象的get(key)方法,获取值,需要强转

把descript和apkurl定义成类的成员变量

校验是否有新版本

当前的版本和服务端返回的版本进行判断

版本一致进入主界面

如果不同,弹出升级对话框

通过Handler来传递消息

在Activity里面定义类的成员变量Handler,使用匿名内部类来实现handler,重写方法handleMessage()

在网络访问的线程里面

获取到Message对象,调用Message.obtain()方法,获取已经存在的不要new

设置Message对象的what属性,设置不同的标记,定义成类常量

调用Handler对象的sendMessage()方法,参数:Message对象

处理信息

在handleMessage()方法里面进行处理

switch判断不同的what标记,展示对话框和Toast,跳转到主界面

跳转到主页

使用显式意图跳转界面

获取Intent对象,

调用startActivity()方法

关闭当前页面

finish()

解决页面跳转太快

在联网之前定义一个开始时间startTime

联网结束定义一个结束时间endTime

相隔的时间如果小于2秒(2000),

线程休息2000减去相隔的毫秒,Thread.sleep()

界面跳转的动画

获取AlphaAnimation 对象,通过new出来,构造参数:

0.2f ,1.0f 透明度的变化 0.2到1

调用AlphaAnimation 对象的setDuration()方法,设置时间,参数:毫秒

给界面的根布局定义id,找到这个控件

调用View对象的startAnimation()方法,开始动画,参数:AlphaAnimation 对象

package com.qingguow.mobilesafe;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; import org.json.JSONException;
import org.json.JSONObject; import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.animation.AlphaAnimation;
import android.widget.TextView;
import android.widget.Toast; import com.qingguow.mobilesafe.utils.StreamTools; public class SplashActivity extends Activity {
private static final String TAG = "SplashActivity";
protected static final int ENTER_HOME = 0;
protected static final int VERSION_UPDATE = 1;
protected static final int URL_ERROR = 2;
protected static final int NETWORK_ERROR = 3;
protected static final int JSON_ERROE = 4;
private TextView tv_splash_version;
private String description;
private String apkurl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
tv_splash_version = (TextView) findViewById(R.id.tv_splash_version);
tv_splash_version.setText("版本号" + getVersionName());
// 检查更新
checkVersion();
//界面动画
AlphaAnimation aa=new AlphaAnimation(0.2f, 1.0f);
aa.setDuration(1000);
findViewById(R.id.rl_splash_root).setAnimation(aa);
} private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case ENTER_HOME:
enterHome();
break;
case VERSION_UPDATE:
Toast.makeText(getApplicationContext(), description, 0).show();
break;
case URL_ERROR:
Toast.makeText(getApplicationContext(), "URL错误", 0).show();
enterHome();
break;
case NETWORK_ERROR:
Toast.makeText(getApplicationContext(), "网络错误", 0).show();
enterHome();
break;
case JSON_ERROE:
Toast.makeText(getApplicationContext(), "JSON解析错误", 0).show();
enterHome();
break; }
} };
/**
* 进入主页
*/
private void enterHome() {
Intent intent =new Intent(SplashActivity.this,HomeActivity.class);
startActivity(intent);
finish();
};
/**
* 检查新版本
*/
private void checkVersion() {
new Thread() {
public void run() {
long startTime=System.currentTimeMillis();
Message mes = Message.obtain();
URL url;
try {
url = new URL(getString(R.string.serverurl));
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(4000);
int code = conn.getResponseCode();
if (code == 200) {
InputStream is = conn.getInputStream();
String result = StreamTools.readInputStream(is);
JSONObject json = new JSONObject(result);
String newVersion = (String) json.get("version");
if (newVersion.equals(getVersionName())) {
// 进入主界面
mes.what = ENTER_HOME;
} else {
// 版本更新
mes.what = VERSION_UPDATE;
description=(String) json.get("description");
apkurl=(String) json.get("apkurl");
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
Log.i(TAG, "URL错误");
mes.what = URL_ERROR;
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG, "网络连接错误");
mes.what = NETWORK_ERROR;
} catch (JSONException e) {
e.printStackTrace();
Log.i(TAG, "JSON解析错误");
mes.what = JSON_ERROE;
} finally {
//延迟效果
long endTime=System.currentTimeMillis();
long dTime=endTime-startTime;
if(dTime<3000){
try {
Thread.sleep(3000-dTime);
} catch (InterruptedException e) {
}
}
handler.sendMessage(mes);
} };
}.start(); } // 获得应用版本名称
private String getVersionName() {
PackageManager pm = getPackageManager();
try {
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
return info.versionName;
} catch (Exception e) {
e.printStackTrace();
return "";
} }
}

最新文章

  1. Android中基于CGroup的memory子系统HAL层分析-lmkd
  2. JMS开发步骤和持久化/非持久化Topic消息
  3. JavaScript高级程序设计学习笔记--错误处理与调试
  4. R语言AMORE包实现BP神经网络——German数据集
  5. Oracle 课程五之优化器和执行计划
  6. 字符串做异或使用union
  7. NOIP2010关押罪犯 二分+二染色
  8. Block介绍(一)基础
  9. AirPlay简介
  10. Ubuntu ssh的使用
  11. django表单及母板
  12. 【Linux CentOS 在虚拟机中XShell出现: (port 22): Connection failed.】
  13. C#反射概念以及实例详解【转】
  14. js 判断是不是手机访问
  15. 【JavaScript数组】
  16. CXF之&quot;@XmlType.name 和 @XmlType.namespace 为类分配不同的名称&quot;错误
  17. 微信小程序小结
  18. win10切换AHCI模式
  19. 动态代理实现AOP
  20. 判断是否是json

热门文章

  1. Alpha冲刺 - (4/10)
  2. i==1 &amp;&amp; resolve()
  3. Android开发工程师文集-相关控件的讲解,五大布局
  4. touch-action属性引起的探索
  5. fiddler 使用方法汇总
  6. itext7知识点研究(PDF编辑)
  7. mysql数据表修复
  8. MathWorks官方消息:神经网络工具箱不能编译
  9. Android多线程编程&lt;二&gt;Handler异步消息处理机制之Message
  10. 从零开始学 Web 之 DOM(六)为元素绑定与解绑事件