[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 "";
        }

    }
}
时间: 2024-10-11 05:56:07

[android] 手机卫士欢迎页检测更新的相关文章

Android 手机卫士--弹出对话框

在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private Handler mHandler = new Handler() { // public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_VERSION: //弹出对话框,提示用户更新 //showUp

Android 手机卫士--签名文件说明&amp;包名说明

在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务器端下载apk 本文地址:http://www.cnblogs.com/wuyudong/p/5903484.html,转载请注明源地址. 本文实现下载本机apk的安装,过程很简单,参考<Android APK的安装> 代码如下: /** * 安装对应的apk * @param file 安装文件

android手机赚钱软件排行2014-05-08更新

1,招财猫:官方下载 每天5分钟至少2块钱 使用方法:每天20次左滑,每次50元宝,一共1000元宝=1RMB,其他左滑每次4元宝,一天最多1000次:每天摇一摇50-1000元宝,统计下来,500比较多:每天任务满888元宝,可以分享一次,500元宝:其他少量下载任务: 2.疯狂锁屏:官方下载 每天5毛 使用方法:在"赚钱"里面下载7个壁纸,每个壁纸自动使用24小时,每个壁纸5金币=5毛钱.特点:无需操作 3.锁屏赚:官方下载 每天1块5毛 使用方法:左滑15次,每次1毛,每10分钟

Android 手机卫士--确认密码对话框编写

本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. 布局文件和<Android 手机卫士--设置密码对话框>中的布局基本类似,所有copy一下,修改一点细节就搞定: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

Android 手机卫士--阶段小结1

本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本名称的展示,从清单配置文件中获取版本名称,PackageManager 服务端新版本的检测(本地版本号<服务器版本号) 展示logo 2.手机防盗 sim卡绑定:每一款手机都会有相应的卡的序列号,一旦替换掉原有电话卡,序列号会发生改变 3.手机卫士分包 基础课程分包方式,每一个类包名, com.it

Android 手机卫士--安装过程中点击回退按钮

本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再说”,而是选择点击回退按键,那么这时候的逻辑应该是让用户进入home界面而不是splash界面.所以需要添加代码逻辑来控制,添加的代码如下: builder.setOnCancelListener(new OnCancelListener() { @Override public void onCa

Android 手机卫士12--进程管理

1.本进程不能被选中,所以先将checkbox隐藏掉--手机卫士 不能自杀 if(getItem(position).packageName.equals(getPackageName())){ holder.cb_box.setVisibility(View.GONE); }else{ holder.cb_box.setVisibility(View.VISIBLE); } 2.清理选中进程 private void clearAll() { //1,获取选中进程 //2,创建一个记录需要杀死

[android] 手机卫士自定义滚动控件

TextView控件设置单行显示 android:singleLine=”true” 设置TextView开始的位置显示省略号,android:ellipsize=”start” 设置滚动属性,android:ellipsize=”marquee” 当控件有焦点的时候,才会调用那个滚动效果 新建一个ui包 新建一个类FocusedTextView继承系统的TextView 重写构造方法 重写isFoused()方法,返回true,就可以让它生来就有焦点,其实并没有焦点,只是欺骗了android系

Android 手机卫士17--缓存清理

清理单个应用缓存 通过反射调用方法 需要权限:android.permission.DELETE_CACHE_FILES. 以上权限为系统权限,手机卫士应用为用户应用,不能拿到此权限 换思路: 调用系统清除缓存的界面,让用户在系统清除缓存界面实现清除逻辑 查找系统清除缓存的界面方法: