[android] 手机卫士欢迎页检测更新
客户端:去服务器获取最新的版本信息
服务器端:
版本信息,最新的版本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 "";
} }
}
[android] 手机卫士欢迎页检测更新的更多相关文章
- Android 手机卫士--参照文档编写选择器
本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...
- Android 手机卫士--签名文件说明&包名说明
在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务 ...
- Android 手机卫士--弹出对话框
在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...
- Android 手机卫士--设置界面&功能列表界面跳转逻辑处理
在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...
- Android 手机卫士--确认密码对话框编写
本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码
Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...
- Android 手机卫士--阶段小结1
本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...
- Android 手机卫士--导航界面1的布局编写
本文地址:http://www.cnblogs.com/wuyudong/p/5943005.html,转载请注明出处. 本文实现导航界面1的布局的实现,效果如下图所示: 首先分析所使用的布局样式: ...
- Android 手机卫士--安装过程中点击回退按钮
本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再 ...
随机推荐
- 加盟阿里!贾扬清被曝从Facebook离职,任阿里硅谷研究院VP
3 月 2 日傍晚,知乎上爆出一则 AI 人事变动大消息——Caffe 作者贾扬清将从 Facebook 离职. 短短数小时,就有近 10 万人浏览这个问题.不仅如此,据 AI 前线爆料,贾扬清离开 ...
- PowerShell 使用.NetFramework
我们都知道,由于PowerShell是基于.NETFramework建立的所以它能够具备访问.NET的能力,因为.NET提供了庞大的数据类库,所以我们可以很好的使用PowerShell去完成一些Pow ...
- 第三周Access的总结
一.问;这节课你学到了什么知识? 答:这周我学得比较少,主要是学Access的数据库进行基本的维护. 2.3数据库的基本维护 对Access定期检查,修复是整个数据库重要部分: 1.Access可修复 ...
- Junit 命令行测试 报错:Could not find class 理解及解决方法
一.报错 : 『Could not find class』 下面给出三个示例比较,其中只有第一个是正确的. 1. MyComputer:bin marikobayashi$ java -cp .:./ ...
- ReactNative学习笔记(五)踩坑总结
已经发现的bug或者问题 Android不支持shadow属性: Animated.Image的borderRadius不生效: setNativeProps无法修改图片的source: 没有直接设置 ...
- [UWP]实现一个轻量级的应用内消息通知控件
在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDialog.ContentDialog或者ToastNotification来完成功能. 但是,我们 ...
- create-react-app创建的项目npm run build之后静态文件找不到
create-react-app创建的项目npm run build之后,运行build中的index.html,什么都没显示,打开浏览器的F12,发现了几个红色的报错,提示几个文件找不到. 查看生成 ...
- JavaScript在IE和Firefox的不兼容问题解决方法总结
1.兼容Firefox的 outerHTML,Firefox中没有outerHtml的方法. if (window.HTMLElement) { HTMLElement.prototype.__def ...
- dwr学习(一):简单dwr实例
博客分类: dwr 最近写ajax写烦了,想着能不能有个更简单的“ajax”,一问就问到这个dwr了.赶紧去官网学习了下,这里写个博客记录一下实例. 测试环境:tomcat6.0 1.新建一个w ...
- Keras 资源
Keras中文文档 github Keras example 官方博客 A ten-minute introduction to sequence-to-sequence learning in Ke ...