手机安全卫士学习第一课 闪屏页面Splash

学习完了四大组件 然后按照黑马课程就是安全卫士了

四大组件学习之后感觉印象不是很深刻,所以趁着这个项目好好练习练习。

个人喜欢在注释中描述所以就只姐连着注释代码和注释一起贴上先!

首先是onCreate中

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_layout);
//        初始化控件
        tvVersion= (TextView) findViewById(R.id.splash_version);
        tvVersion.setText("版本号: "+getVersionName());
//        方法:检查版本
        checkVerson();
    }

在闪屏页的开始就需要进行版本号的比对

所有下面是checkVersion()方法

   /*
    * 网络访问是不可以在主线程中进行的*/
    private void checkVerson(){
        //获取开始时间
        final long startTime=System.currentTimeMillis();

     /*开启子线程*/
        new Thread(new Runnable() {
            @Override
            public void run() {
//                创建网络连接
                HttpURLConnection conn=null;
//                创建一个信息
                Message message=Message.obtain();
                try {
                    //本机地址用localhost,但是如果用模拟器加载本机的地址时,
                    // 可以用ip(10.0.2.2)来替换
                    //这里的URL是乱写的~~
                    URL url=new URL("http://www.baidu.com");
                    conn= (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");//设置请求方法
                    conn.setConnectTimeout(5000);//设置连接超时
                    conn.setReadTimeout(5000);//设置响应超时,连接上了但是服务器迟迟不给响应
                    conn.connect();//连接服务器
                    int responseCode=conn.getResponseCode();//获取响应码
                    if(responseCode==200){
                        InputStream inputStream=conn.getInputStream();
                        String result= StreamUtils.readFormStream(inputStream);
                        System.out.print(result);

                        //上面是一个标准的网络连接然后获取数据的模式 背下来好了

                        //因为实际是没有接收到JSON数据所以就没法真正的解析JSON
                        //不过JSON在之前的老黄历项目中已经研究过了所以还好
                        /*
                        * 解析JSON*/
                       /* JSONObject jo=new JSONObject(result);
                        mVersionName=jo.getString("versionName");
                        mVersionCode=jo.getInt("versionCode");
                        mDesc=jo.getString("Desc");*/
                        //对JSON传回的版本号和此应用的版本号进行比对
                        //这里模拟JSON传回版本号是2 所以肯定会提示更新
                        if(mVersionCode>getVersionCode()){
                            //判断是否有更新
                            message.what=CODE_UPDATE_DIALOG;
                        }else{
                            message.what=CODE_ENTER_HOME;
                        }
                    }
                } catch (MalformedURLException e) {
                    //URL错误异常
                    message.what=CODE_URL_ERROR;
                    e.printStackTrace();
                } catch (IOException e) {
                    //网络错误异常
                    message.what=CODE_NET_ERROR;
                    enterHome();
                    e.printStackTrace();
                }finally {
                    long endTime=System.currentTimeMillis();
                    //访问网络发挥的时间
                    long timeUsed=endTime-startTime;
                    if(timeUsed<2000){
                        //强制休眠一段时间,保证闪屏页展示两秒钟
                        try {
                            Thread.sleep(2000-timeUsed);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    mHandler.sendMessage(message);
                    if(conn!=null){
                        conn.disconnect();
                    }
                }
            }
        }).start();

    }
这里使用了一个工具类

StreamUtils

/**
 * Created by admin on 2016/5/9.
 */
public class StreamUtils {
    /*
    * 将输入流读取成String后返回*/
    public static String readFormStream(InputStream in) throws IOException {
        //1 创建输出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        int len = 0;
        byte[] buffer = new byte[1023];
        //2 读取输入流并写入输出流
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        String result = out.toString();
        //3 关闭输入流与输出流
        in.close();
        out.close();
        return result;
    }
}

还有就是获取版本号的方法

    /*
* 获取版本号*/
    private int getVersionCode(){
        PackageManager packageManager=getPackageManager();
        try {
            PackageInfo packageInfo=packageManager.getPackageInfo(getPackageName(),
                    0);//获取包的信息
            int versionCode=packageInfo.versionCode;
            return versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return -1;
    }

对于子线程中传回的消息有对应的处理

这里贴上Handler

//    用Handler来接收子线程中返回的信息然后做出相应的反应
    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case CODE_UPDATE_DIALOG:
                    showUpdateDailog();
                    break;
                case CODE_URL_ERROR:
                    Toast.makeText(SplashActivity.this, "URL异常", Toast.LENGTH_SHORT).show();
                    break;
                case CODE_NET_ERROR:
                    Toast.makeText(SplashActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
                    break;
                case CODE_ENTER_HOME:
                    enterHome();
                    break;
            }
        }
    };

如果发现有更新 就弹出对话框提示更新

/*
弹出更新对话框
* */
private void showUpdateDailog() {
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder.setTitle("最新版本"+mVersionName);
    builder.setMessage(mDesc);
    builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(SplashActivity.this, "更新", Toast.LENGTH_SHORT).show();
            download();
        }
    });
    builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            enterHome();
        }
    });
    builder.show();
}

对话框的实现已经做了好几次了所以就还好啦

然后这里如果选择更新  会调用 download方法

这里使用了一个开源框架 xUtils

代码如下

/*
* 下载APK文件*/
private void download() {

    //判断SD卡的状态 判断是否挂载

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        String target =Environment.getExternalStorageDirectory() + "/upfate.apk";
        //XUtils开源框架
        HttpUtils utils = new HttpUtils();
        utils.download("", target, new RequestCallBack<File>() {

            //下载文件的进度
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                super.onLoading(total, current, isUploading);
                System.out.print("下载进度:" + current + "/" + total);
            }

            @Override
            public void onSuccess(ResponseInfo<File> responseInfo) {
                System.out.print("下载失败");
            }

            @Override
            public void onFailure(HttpException e, String s) {
                System.out.print("下载成功");
            }
        });
    }

}

非常方便有木有!!~~~

其实这个框架提供了好多功能 在后面好好学习一下~

当然弹窗如果选择不care就直接跳转到主页面啦 intent搞定就可以

贴上源码  很多地方有模拟 但是也能表现一些知识点了

注意一下 在选择下载新版本的时候为了防止网速太快导致闪屏页太快跳转所以让子线程睡了一会儿

long endTime=System.currentTimeMillis();
//访问网络发挥的时间
long timeUsed=endTime-startTime;
if(timeUsed<2000){
    //强制休眠一段时间,保证闪屏页展示两秒钟
    try {
        Thread.sleep(2000-timeUsed);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
mHandler.sendMessage(message);

总之是要看两秒我的闪屏页就是了 哈哈哈

源码如下:

package skkk.admin.com.newgoal.activity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;

import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import skkk.admin.com.newgoal.R;
import skkk.admin.com.newgoal.utils.StreamUtils;

public class SplashActivity extends AppCompatActivity {
    private static final int CODE_UPDATE_DIALOG =0;
    private static final int CODE_URL_ERROR = 1;
    private static final int CODE_NET_ERROR = 2;
    private static final int CODE_ENTER_HOME = 4;
    private TextView tvVersion;
    String mVersionName;
    private int mVersionCode=2;
    private String mDesc;
//    用Handler来接收子线程中返回的信息然后做出相应的反应
    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case CODE_UPDATE_DIALOG:
                    showUpdateDailog();
                    break;
                case CODE_URL_ERROR:
                    Toast.makeText(SplashActivity.this, "URL异常", Toast.LENGTH_SHORT).show();
                    break;
                case CODE_NET_ERROR:
                    Toast.makeText(SplashActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
                    break;
                case CODE_ENTER_HOME:
                    enterHome();
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_layout);
//        初始化控件
        tvVersion= (TextView) findViewById(R.id.splash_version);
        tvVersion.setText("版本号: "+getVersionName());
//        方法:检查版本
        checkVerson();
    }

    /*
    * 获取版本名字*/
    private String getVersionName(){
        PackageManager packageManager=getPackageManager();
        try {
            PackageInfo packageInfo=packageManager.getPackageInfo(getPackageName(),
                    0);//获取包的信息
            String versionName=packageInfo.versionName;
            return versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }

    /*
* 获取版本号*/
    private int getVersionCode(){
        PackageManager packageManager=getPackageManager();
        try {
            PackageInfo packageInfo=packageManager.getPackageInfo(getPackageName(),
                    0);//获取包的信息
            int versionCode=packageInfo.versionCode;
            return versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return -1;
    }

    /*
    * 网络访问是不可以在主线程中进行的*/
    private void checkVerson(){
        //获取开始时间
        final long startTime=System.currentTimeMillis();

     /*开启子线程*/
        new Thread(new Runnable() {
            @Override
            public void run() {
//                创建网络连接
                HttpURLConnection conn=null;
//                创建一个信息
                Message message=Message.obtain();
                try {
                    //本机地址用localhost,但是如果用模拟器加载本机的地址时,
                    // 可以用ip(10.0.2.2)来替换
                    //这里的URL是乱写的~~
                    URL url=new URL("http://www.baidu.com");
                    conn= (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");//设置请求方法
                    conn.setConnectTimeout(5000);//设置连接超时
                    conn.setReadTimeout(5000);//设置响应超时,连接上了但是服务器迟迟不给响应
                    conn.connect();//连接服务器
                    int responseCode=conn.getResponseCode();//获取响应码
                    if(responseCode==200){
                        InputStream inputStream=conn.getInputStream();
                        String result= StreamUtils.readFormStream(inputStream);
                        System.out.print(result);

                        //上面是一个标准的网络连接然后获取数据的模式 背下来好了

                        //因为实际是没有接收到JSON数据所以就没法真正的解析JSON
                        //不过JSON在之前的老黄历项目中已经研究过了所以还好
                        /*
                        * 解析JSON*/
                       /* JSONObject jo=new JSONObject(result);
                        mVersionName=jo.getString("versionName");
                        mVersionCode=jo.getInt("versionCode");
                        mDesc=jo.getString("Desc");*/
                        //对JSON传回的版本号和此应用的版本号进行比对
                        //这里模拟JSON传回版本号是2 所以肯定会提示更新
                        if(mVersionCode>getVersionCode()){
                            //判断是否有更新
                            message.what=CODE_UPDATE_DIALOG;
                        }else{
                            message.what=CODE_ENTER_HOME;
                        }
                    }
                } catch (MalformedURLException e) {
                    //URL错误异常
                    message.what=CODE_URL_ERROR;
                    e.printStackTrace();
                } catch (IOException e) {
                    //网络错误异常
                    message.what=CODE_NET_ERROR;
                    enterHome();
                    e.printStackTrace();
                }finally {
                    long endTime=System.currentTimeMillis();
                    //访问网络发挥的时间
                    long timeUsed=endTime-startTime;
                    if(timeUsed<2000){
                        //强制休眠一段时间,保证闪屏页展示两秒钟
                        try {
                            Thread.sleep(2000-timeUsed);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    mHandler.sendMessage(message);
                    if(conn!=null){
                        conn.disconnect();
                    }
                }
            }
        }).start();

    }

    /*
    弹出更新对话框
    * */
    private void showUpdateDailog() {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("最新版本"+mVersionName);
        builder.setMessage(mDesc);
        builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SplashActivity.this, "更新", Toast.LENGTH_SHORT).show();
                download();
            }
        });
        builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                enterHome();
            }
        });
        builder.show();
    }

    /*
    * 下载APK文件*/
    private void download() {

        //判断SD卡的状态 判断是否挂载

        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String target =Environment.getExternalStorageDirectory() + "/upfate.apk";
            //XUtils开源框架
            HttpUtils utils = new HttpUtils();
            utils.download("", target, new RequestCallBack<File>() {

                //下载文件的进度
                @Override
                public void onLoading(long total, long current, boolean isUploading) {
                    super.onLoading(total, current, isUploading);
                    System.out.print("下载进度:" + current + "/" + total);
                }

                @Override
                public void onSuccess(ResponseInfo<File> responseInfo) {
                    System.out.print("下载失败");
                }

                @Override
                public void onFailure(HttpException e, String s) {
                    System.out.print("下载成功");
                }
            });
        }

    }

    private  void enterHome(){
        Intent intent=new Intent(SplashActivity.this,HomeActivity.class);
        startActivity(intent);
        finish();
    }
}

时间: 2024-10-03 22:59:09

手机安全卫士学习第一课 闪屏页面Splash的相关文章

1.闪屏页面(Splash)

闪屏页面(Splash) - 展示logo,公司品牌- 项目初始化- 检测版本更新- 校验程序合法性(比如:判断是否有网络,有的话才运行) 检测版本更新 在toncat中放入一个json数据用来判断版本信息 {"versionName": "2.0", "versionCode": 2, "description": "新增NB功能,赶紧体验!!!", "downloadUrl": &q

微信SDK开发学习第一课

1.为什么学习微信API开发? 微信注册用户6亿,把微信当做推广平台已经成为主流. 2.微信SDK主要功能有哪些? 主要功能:分享给朋友,分享到朋友圈 3.如何使用微信SDK? 3.1 打开微信SDK主页注册账号:https://open.weixin.qq.com/ 3.2 点击管理中心-->移动应用-->创建移动应用:填写基本信息 移动应用名称:微信SDK学习第一课 英文名称(选填):WebChat SDK interface to learn one. 移动应用简介:学习微信开发第一课

jquery 学习第一课之start

1.$选取符 ( $ == jQuery ) (1) $("div").addClass("special");选取本页面中的所有<div>元素,然后将这些div加上都加上一个名为“special”的CSS样式. (2)$("div")选取所有的div元素. (3)$(“#body”)选取id为body的元素. (4)$("div #body")选取id为body的<div>. (5)$("d

Magento学习第一课——目录结构介绍

Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zend框架提供了面向对象的代码库并且有很好的团队支持.通过这个框架,Magento主要围绕三个基本点建立: 1. 灵活性:我们相信每一个解决方案都像它的商务支持一样是独一无二的.Magento的代码可以无缝定制的. 2. 可升级性:Magento可方便的实行定制且不丧失升级的能力,因为从社区中获得核心代

IOS学习第一课

第一课,也就是公认的HelloWorld了. 步骤如下: 1  创建helloWorld工程 2 实现QuizViewController.h文件 3 实现QuizViewController.m文件 4 使用StorBoard绘制界面 5 连接输出口 6 定义事件 IOS学习第一课

FPGA入门学习第一课:二分频器

分频器还是比较简单的,一般的思路是:每数几个时钟就输出一个时钟.最简单的当数二分频器了,每当时钟上升沿(或下降沿)就把输出翻转一下.这样就刚好实现了二分频器了. 网上也搜到了最简实现”二分频最简单了,一句话就可以了:               always @ (negedge clk)        clk_2<=~clk_2;“ 但仿真时却发现无法输出 分析是因为输出信号的初始状态不确定造成的,于是加了一句初始化,就可以正常分频了 但观察他们生成的逻辑结构图是一样的 完整代码如下: mod

linux学习第一课

linux学习第一课,打卡打卡 原文地址:https://blog.51cto.com/12910091/2436322

手机安全卫士学习(2)

今天是安全卫士学习第二天,主要涉及以下内容: 1 安全卫士主页面的布局 其中涉及gridview的使用,包括布局文件的引用,以及自定义控件textview <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width=&qu

python学习第一课要点记录

写在要点之前的一段话,留给将来的自己:第一次参加编程的培训班,很兴奋很激动,之前都是自己在网上找免费的视频来看,然后跟着写一些课程中的代码,都是照着模子写,没有自己过多的思考.感觉这样学不好,除了多写以外,还得自己思考,经过了自己思考的源码,才能真正成为自己的东西.在上课前,班主任就让我们自己想一下,通过这个培训,要达到的目标.其实我的目标很简单,不求通过这个培训班能成为什么开发工程师,年薪百万,达到人生巅峰,赢取白富美.那个不现实,我只求能够在现在实际工作中(我的工作主要是网络运维,还兼有系统