• Android 手机卫士--解析json与消息机制发送不同类型消息


    本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址。

    1、解析json数据

    解析json的代码很简单

    JSONObject jsonObject = new JSONObject(json);
                            
    //debug调试,解决问题
    String versionName = jsonObject.getString("versionName");
    mVersionDes = jsonObject.getString("versionDes");
    String versionCode = jsonObject.getString("versionCode");
    mDownloadUrl = jsonObject.getString("downloadUrl");
    // 日志打印    
    Log.i(tag, versionName);
    Log.i(tag, mVersionDes);
    Log.i(tag, versionCode);
    Log.i(tag, mDownloadUrl);

    2、使用消息机制发送不同类型消息

    在获取服务器端json数据后,得到app的版本号,通过和客户端的版本号进行对比

        //比对版本号(服务器版本号>本地版本号,提示用户更新)
                            if(mLocalVersionCode < Integer.parseInt(versionCode)) {
                                //提示用户更新,弹出对话框(UI),消息机制
                                msg.what = UPDATE_VERSION;
                                
                            } else {
                                //进入应用程序主界面
                                msg.what = ENTER_HOME;
                            }

    可以使用android的消息机制发送不同类型消息,可以参考《Android消息机制入门

    首先新建Handler

        private Handler mHandler = new Handler() {
            //
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case UPDATE_VERSION:
                    //弹出对话框,提示用户更新
                    //showUpdateDialog();
                    break;
                case ENTER_HOME:
                    //进入应用程序主界面,activity跳转过程
                    enterHome();
                    break;
                case URL_ERROR:
                    //ToastUtil.show(getApplicationContext(), "url异常");
                    enterHome();
                    break;
                case IO_ERROR:
                    //ToastUtil.show(getApplicationContext(), "读取异常");
                    enterHome();
                    break;
                case JSON_ERROR:
                    //ToastUtil.show(getApplicationContext(), "json解析异常");
                    enterHome();
                    break;
                default:
                    break;
                }
            };
        };

    在定义一些出现状态码和出现异常时候的错误码:

        /**
         * 更新新版本的状态码
         */
        protected static final int UPDATE_VERSION = 100;
        /**
         * 进入应用程序主界面状态码
         */
        protected static final int ENTER_HOME = 101;
        
        /**
         * url地址出错状态码
         */
        protected static final int URL_ERROR = 102;
        //以下是其他各种出错状态码
        protected static final int IO_ERROR = 103;
        protected static final int JSON_ERROR = 104;

    接着实现enterHome()函数,作用:跳转到主界面

        /**
         * 进入应用程序主界面
         */
        protected void enterHome() {
            Intent intent = new Intent(this, HomeActivity.class);
            startActivity(intent);
            //在开启一个新的界面后,将导航界面关闭(导航界面只可见一次)
            finish();
        }

    所以顺便新建一个HomeActivity.java

    public class HomeActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
        }
    }

    当然还有一个activity_home.xml文件,随便加一点代码,先看到效果,后期再修改

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:text="HOMEACTIVITY"
            android:textSize="20sp"
            android:textColor="#000"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>

    运行项目后发现,当没有版本更新的时候,splash界面停留的时间很短,于是可以将指定睡眠时间,当请求网络的时长超过4秒则不做处理,请求网络的时长小于4秒,强制让其睡眠满4秒钟。这样splash界面会停留一会,然后跳转到HomeActivity界面

        //指定睡眠时间,请求网络的时长超过4秒则不做处理
                        //请求网络的时长小于4秒,强制让其睡眠满4秒钟
                        long endTime = System.currentTimeMillis();
                        if(endTime - startTime < 4000) {
                            try {
                                Thread.sleep(4000 - (endTime - startTime));
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        mHandler.sendMessage(msg);

    完整的代码如下:

    package com.wuyudong.mobilesafe.activity;
    
    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 com.wuyudong.mobilesafe.R;
    import com.wuyudong.mobilesafe.Utils.StreamUtil;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.util.Log;
    import android.widget.TextView;
    
    /**
     * @author wuyudong
     * 
     */
    
    public class SplashActivity extends Activity {
    
        protected static final String tag = "SplashActivity";
        /**
         * 更新新版本的状态码
         */
        protected static final int UPDATE_VERSION = 100;
        /**
         * 进入应用程序主界面状态码
         */
        protected static final int ENTER_HOME = 101;
        
        /**
         * url地址出错状态码
         */
        protected static final int URL_ERROR = 102;
        //以下是其他各种出错状态码
        protected static final int IO_ERROR = 103;
        protected static final int JSON_ERROR = 104;
        
        private TextView tv_version_name;
        private int mLocalVersionCode;
        private String mVersionDes;
        private String mDownloadUrl;
        
        private Handler mHandler = new Handler() {
            //
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case UPDATE_VERSION:
                    //弹出对话框,提示用户更新
                    //showUpdateDialog();
                    break;
                case ENTER_HOME:
                    //进入应用程序主界面,activity跳转过程
                    enterHome();
                    break;
                case URL_ERROR:
                    //ToastUtil.show(getApplicationContext(), "url异常");
                    enterHome();
                    break;
                case IO_ERROR:
                    //ToastUtil.show(getApplicationContext(), "读取异常");
                    enterHome();
                    break;
                case JSON_ERROR:
                    //ToastUtil.show(getApplicationContext(), "json解析异常");
                    enterHome();
                    break;
                default:
                    break;
                }
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 去掉当前actinity的tittle
            // requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_splash);
    
            // 初始化UI
            initUI();
            // 初始化数据
            initData();
    
        }
    
        /**
         * 进入应用程序主界面
         */
        protected void enterHome() {
            Intent intent = new Intent(this, HomeActivity.class);
            startActivity(intent);
            //在开启一个新的界面后,将导航界面关闭(导航界面只可见一次)
            finish();
        }
    
        /**
         * 获取数据方法
         */
        private void initData() {
            // 1.应用版本名称
            tv_version_name.setText("版本名:" + getVersionName());
            // 检测(本地版本号与服务器版本号比对)是否有更新,如果有更新,提示用户下载
            // 2.获取本地版本号
            mLocalVersionCode = getVersionCode();
            // 3,获取服务器版本号(客户端发请求,服务端给响应,(json,xml))
            // http://www.oxxx.com/update74.json?key=value 返回200 请求成功,流的方式将数据读取下来
            // json中内容包含:
            /*
             * 更新版本的版本名称|新版本的描述信息|服务器版本号|新版本apk下载地址
             */
            checkVersion();
    
        }
    
        /**
         * 检测版本号
         */
        private void checkVersion() {
            new Thread() {
                public void run() {
                    // 发送请求获取数据,参数则为请求json的链接地址
                    // http://192.168.13.99:8080/update.json 测试阶段不是最优
                    // 仅限于模拟器访问电脑tomcat
                    Message msg = Message.obtain();
                    long startTime = System.currentTimeMillis();
    
                    try {
                        // 1,封装url地址
                        URL url = new URL("http://169.254.178.87:8080/update.json");
                        // 2,开启一个链接
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        // 3,设置常见请求参数(请求头)
                        // 请求超时
                        connection.setConnectTimeout(2000);
                        // 读取超时
                        connection.setReadTimeout(2000);
                        
                        // 默认就是get请求方式
                        //connection.setRequestMethod("POST");
                        
                        // 4,获取请求成功响应码
                        if(connection.getResponseCode() == 200) {
                            // 5,以流的形式,将数据获取下来
                            InputStream is = connection.getInputStream();
                            // 6,将流转换成字符串(工具类封装)
                            String json = StreamUtil.streamToString(is);
                            // 记得添加权限-->android.permission.INTERNET
                            Log.i(tag, json);    
                            
                            //7,json解析
                            JSONObject jsonObject = new JSONObject(json);
                            
                            //debug调试,解决问题
                            String versionName = jsonObject.getString("versionName");
                            mVersionDes = jsonObject.getString("versionDes");
                            String versionCode = jsonObject.getString("versionCode");
                            mDownloadUrl = jsonObject.getString("downloadUrl");
                            
                            // 日志打印    
                            Log.i(tag, versionName);
                            Log.i(tag, mVersionDes);
                            Log.i(tag, versionCode);
                            Log.i(tag, mDownloadUrl);
                            
                            //8,比对版本号(服务器版本号>本地版本号,提示用户更新)
                            if(mLocalVersionCode < Integer.parseInt(versionCode)) {
                                //提示用户更新,弹出对话框(UI),消息机制
                                msg.what = UPDATE_VERSION;
                                
                            } else {
                                //进入应用程序主界面
                                msg.what = ENTER_HOME;
                            }
                        }
                        
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                        msg.what = URL_ERROR;
                    } catch (IOException e) {
                        e.printStackTrace();
                        msg.what = IO_ERROR;
                    } catch (JSONException e) {
                        e.printStackTrace();
                        msg.what = JSON_ERROR;
                    } finally {
                        //指定睡眠时间,请求网络的时长超过4秒则不做处理
                        //请求网络的时长小于4秒,强制让其睡眠满4秒钟
                        long endTime = System.currentTimeMillis();
                        if(endTime - startTime < 4000) {
                            try {
                                Thread.sleep(4000 - (endTime - startTime));
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        mHandler.sendMessage(msg);
                    }
                };
    
            }.start();
        }
    
        /**
         * 返回版本号的方法
         * 
         * @return 非0代表成功
         */
        private int getVersionCode() {
    
            // 1.管理者对象packageManager
            PackageManager pm = getPackageManager();
            // 2.从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号)
            try {
                PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
                // 3.获取版本名称
                return packageInfo.versionCode;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
    
        }
    
        /**
         * 获取版本名称:清单文件中
         * 
         * @return 应用版本名称 返回null代表有异常
         */
        private String getVersionName() {
            // 1.管理者对象packageManager
            PackageManager pm = getPackageManager();
            // 2.从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号)
            try {
                PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
                // 3.获取版本名称
                return packageInfo.versionName;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    
        }
    
        /**
         * 初始化UI方法 alt+shift+j
         */
        private void initUI() {
    
            tv_version_name = (TextView) findViewById(R.id.tv_version_name);
        }
    
    }
  • 相关阅读:
    【网络编程3】网络编程基础-arp请求(局域网主机扫描)
    【CTF MISC】隐写术wireshark找出图片-“强网杯”网络安全挑战赛writeup
    【网络编程2】网络编程基础-发送ICMP包(Ping程序)
    【网络编程1】网络编程基础-TCP、UDP编程
    【漏洞分析】两个例子-数组溢出修改返回函数与strcpy覆盖周边内存地址
    【Python】zip文件密码破解
    【bzoj1923】[Sdoi2010]外星千足虫 高斯消元
    spring cloud zuul在使用中遇到的坑 : 转发时自动去掉prefix
    Eclipse MAT:浅堆 vs 保留堆
    Java SDK夯住(Hang)问题排查
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5900800.html
Copyright © 2020-2023  润新知