[mobilesafe] 02_Splash界面

Android 4.0

Splash界面 

Splash界面的作用 1、展示产品的logo,提升产品的知名度
2、初始化应用程序的操作(读取配置文件,初始化数据库)
3、产品的注册校验,检查是否有新的版本
alt+shift+s  R  生成Getter和Setter方法
1、id命名规则
组件名缩写-Activity名-功能
android:id="@+id/tv_splash_version" 显示版本信息
2、获取版本号,从AndroidManifest.xml中获取
// 1、获取包管理者
PackageManager packageManager = this.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);// 参数2,可选
// PackageInfo 就相当于AndroidManifest.xml文件
// 2、获取应用程序versionName
appVersion = packageInfo.versionName;
3、设置主题
application节点下:
android:theme="@android:style/Theme.NoTitleBar" 没有标题栏
4、从服务器上下载版本更新信息,用子线程
/**
 * TODO SplashActivity 2、开启子线程从服务器上获取最新的版本信息
 */
private class CheckVersionTask implements Runnable {
    @Override
    public void run() {
        Message msg = new Message();
        try {
            // 1、通过从config.xml文件中获取path路径,封装成URL对象
            URL url = new URL(getApplicationContext().getResources().getString(R.string.urlPath));
            // 2、开启http请求连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 3、设置请求参数
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            // 4、获取服务器返回码
            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {// 4-1如果是200
                // 4-1-1得到服务器返回的io
                InputStream inputStream = conn.getInputStream();// 返回的是一个版本号xml文件
                updateInfo = UpdateInfoParse.getUnpdateInfo(getApplicationContext(),inputStream);
                if (updateInfo!=null) {
                    msg.what = PARSE_SUCCESS;
                    // handler.sendMessage(msg);//不要重复发送,否则会出现黑屏,后面的finally会发送消息
                    return;
                }else {
                    msg.what = PARSE_ERROR;
                    return;
                }
                
            } else {// 4-2如果不是200
                msg.what = SERVER_RESPONSE_ERROR;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
            // url地址不正确,SERVER_ERROR
            msg.what = SERVER_ERROR;
        } catch (IOException e) {
            // IO_ERROR
            e.printStackTrace();
            msg.what = IO_ERROR;
        } finally {
            // 5、发送信息,不要重复发送,否则会出现黑屏
            handler.sendMessage(msg);
        }
    }
}
5、对于异常,对于是自己的产品,要将每个异常给处理掉,给用户友好的提示,用消息机制
public static final int PARSE_SUCCESS = 11;
public static final int PARSE_ERROR = 10;
public static final int URL_ERROR = 20;
public static final int SERVER_RESPONSE_ERROR = 30;
public static final int IO_ERROR = 40;
protected static final String TAG = "SplashActivity";
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
        case URL_ERROR:
            Toast.makeText(SplashActivity.this.getApplicationContext(),
                    "服务器错误了,URL地址不对", Toast.LENGTH_SHORT).show();
            break;
        case IO_ERROR:
            Toast.makeText(SplashActivity.this.getApplicationContext(),
                    "连接服务器异常。", Toast.LENGTH_SHORT).show();
            break;
        
        case SERVER_RESPONSE_ERROR:
            Toast.makeText(SplashActivity.this.getApplicationContext(),
                    "服务器响应失败", Toast.LENGTH_SHORT).show();
            break;
        case PARSE_SUCCESS:
            Log.i(TAG"解析版本更新xml成功~~~,当前最新版本为:" + updateInfo.getVersion());
            // 比对当前客户端的版本号和服务器的版本号是否一致.
            if (getAppVersion().equals(updateInfo.getVersion())) {// 没有新版本
                Log.i(TAG"版本一致。直接登录");
            } else {// 有新版本
                Log.i(TAG"有新版本,提示用户下载");
            }
            break;
        
        case PARSE_ERROR:
            Log.i(TAG"解析版本更新xml失败!!!");
            break;
        }
    }
};
六、使用pull解析xml 
/**
 * 1、 根据传入的xmlio流,解析出来里面的信息,并返回给客户
 * 
 * @param inputStream 传入的xml文件
 * @return 返回UpdateInfo,如果返回null,解析失败。
 */
public static UpdateInfo getUnpdateInfo(Context context,InputStream inputStream) {
    try {
        // 1、得到一个pull解析器
        XmlPullParser pullParser = Xml.newPullParser();
        // 2、初始化pull解析器
        pullParser.setInput(inputStream, context.getResources().getString(R.string.xmlEncode));
       // FIXME UpdateInfoParse 1、应该将编码encode配置的xml文件中去
        // 3、得到解析事件
        int eventType = pullParser.getEventType();
        // 4、循环遍历解析
        UpdateInfo updateInfo = null;
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagName = pullParser.getName();// 返回节点名字
            switch (eventType) {
            case XmlPullParser.START_TAG:
                if ("info".equals(tagName)) {// 4-1开始解析info节点,new UpdateInfo()对象。
                    updateInfo = new UpdateInfo();
                } else if ("version".equals(tagName)) {
                    String version = pullParser.nextText();
                    updateInfo.setVersion(version);
                } else if ("description".equals(tagName)) {
                    String description = pullParser.nextText();
                    updateInfo.setDescription(description);
                } else if ("path".equals(tagName)) {
                    String urlPath = pullParser.nextText();
                    updateInfo.setUrlPath(urlPath);
                }
                break;
            case XmlPullParser.END_TAG:
                break;
            }
            eventType = pullParser.next();
        }
        // 5、返回解析到的对象
        return updateInfo;
    } catch (XmlPullParserException e) {// 由于有返回值,所以这里可try{}catch{}住
        e.printStackTrace();
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}