Android开发学习笔记-实现联网检测程序版本

package com.frank.mobilesafe;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import org.apache.http.HttpClientConnection;
import org.apache.http.client.methods.HttpUriRequest;
import org.json.JSONObject;

import com.frank.mobilesafe.utils.FileHelper;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;

public class SplashActivity extends Activity {

    private static final int SHOW_UPDATE_DIALOG = 0;
    protected static final int REQUEST_FAILURE = 1;
    protected static final int REQUEST_ERROR = 2;
    private static final int SHOW_HOME = 3;
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            HandlerStartMessage(msg.what);
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // requestWindowFeature(Window.FEATURE_NO_TITLE);设置无标题
        setContentView(R.layout.activity_splash);
        TextView tv_version = (TextView) findViewById(R.id.tv_version);
        tv_version.setText(getVersion());
        CheckUpdate();
    }

    protected void HandlerStartMessage(int what) {
        switch (what) {
        case SHOW_UPDATE_DIALOG:
            Toast.makeText(this, "该升级了", 0).show();
            break;
        case SHOW_HOME:
            //Toast.makeText(this, "show home activity", 0).show();
            ShowMainActivity();
            break;
        case REQUEST_FAILURE:
            Toast.makeText(this, "REQUEST_FAILURE", 0).show();
            break;
        default:
            break;
        }

    }
/**
 * 显示主界面
 */
    private void ShowMainActivity() {
        // TODO Auto-generated method stub
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);
        finish();

    }

    /**
     * 检查升级
     */
    protected void CheckUpdate() {
        new Thread() {
            public void run() {
                long startTime = System.currentTimeMillis();
                Message msg = Message.obtain();
                try {
                    URL url = new URL("http://192.168.1.104/1.html");// 网络链接地址
                    HttpURLConnection conn = (HttpURLConnection) url
                            .openConnection();// 创建连接对象
                    conn.setRequestMethod("GET");// 设置请求方式
                    conn.setReadTimeout(5000);// 设置请求超时时间

                    if (200 == conn.getResponseCode())// 当请成功的时候执行
                    {
                        InputStream inputStream = conn.getInputStream();
                        FileHelper helper = new FileHelper();
                        String content = helper.StreamToString(inputStream);
                        Log.i("a", content);
                        JSONObject obj = new JSONObject(content);
                        String version = (String) obj.get("version");
                        Log.i("version", version);
                        if (version == getVersion()) {
                            msg.what = SHOW_UPDATE_DIALOG;
                        }
                        else
                        {
                            msg.what = SHOW_HOME;
                        }

                    } else {
                        Log.i("a", "请求失败!");
                        msg.what = REQUEST_FAILURE;
                    }
                } catch (Exception e) {
                    Log.i("a", "shibai");
                    msg.what = REQUEST_ERROR;
                    e.printStackTrace();
                } finally {
                    long endTime = System.currentTimeMillis();
                    long spanTime = endTime-startTime;
                    if (spanTime<2000) {
                        try {
                            Thread.sleep(2000-spanTime);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    handler.sendMessage(msg);
                }
            };

        }.start();

    }

    /**
     * 获取版本信息
     *
     * @return
     */
    protected String getVersion() {
        String versionStr = "";
        PackageManager packManger = getPackageManager();
        try {
            PackageInfo info = packManger.getPackageInfo(getPackageName(), 0);
            versionStr = info.versionName;// 获取的版本信息
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            versionStr = "";
            e.printStackTrace();
        }
        return versionStr;

    }
}

问题总结:

1、在解析JSON的时候需要情况一直遇到异常,出错异常信息为org.json.JSONException: Value ? of type java.lang.String cannot be converted to JSONObject,经查得是在保存json文本的时候是使用的记事本造成的,这也就是说在保存JSON的使用应该使用editplus等文本编辑器进行保存,保存的格式应该为utf8 无bom格式,这样在进行解析的时候就不会造成异常。

2、在联网获取数据的时候,因为是在本机iis上配置的站点,不过在请求数据的时候一直请求不到,遇到的第一个原因就是没有对请求设置请求方式以及请求时间,之后对百度等其他网站进行请求都没问题,却对自己配置的请求不了,经过抓耳挠腮之后,查的原因竟是http后面的反斜线少了一个。大意了!

3、在线程内访问线程外的资源的时候,需要使用java事件机制进行处理。主要方法如下:

    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            HandlerStartMessage(msg.what);
        }

    };
protected void CheckUpdate() {
        new Thread() {
            public void run() {
                long startTime = System.currentTimeMillis();
                Message msg = Message.obtain();
              msg.what = SHOW_UPDATE_DIALOG;
              handler.sendMessage(msg);
                }
            };
        }.start();
时间: 2024-10-25 06:42:49

Android开发学习笔记-实现联网检测程序版本的相关文章

Android开发学习笔记:数据存取之SQLite浅析

一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的

【Android开发学习笔记】【第三课】Activity和Intent

首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activity的布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

android开发学习笔记001a

Android 应用与开发环境 1.使用SDK版本:Android 2.3 . 2.发展和历史 创始人:Andy Rubin,Android公司被Google收购.07年11月5日1.0发布. 3.平台架构及特性 Linux内核(操作系统)->函数库,Android运行时(中间件)->应用程序框架->应用程序 我要学习的就是如何在android 操作系统里开发应用程序. 我们只和应用程序框架(Android API)打交道.也就是我们的SDK. 函数库是C/C++的库. Android

【Android开发学习笔记】【第五课】Activity的生命周期-上

今天学习Activity当中的七个生命周期函数: 首先得说一个事情,就是在代码当中如果加入了 System.out.println(" ------");之后,如何查看这里面的输出内容 打开之后只输入“Filter Name”和“by Log Tag” 即可 添加成功后可以看到 本次学习主要总结如下: 1.onCreate() Acitivity首次创建时被调用.用于设置Acitivity的布局文件,绑定按钮监听器等一些普通静态操作. 2.onStart() Acitivity对用户可

android 开发学习笔记 (一)

每个app 都有一个自己的 linux 进程: 每个进程都在自己的虚拟机里执行 两个app 可以跑在一个进程,一个vm里 android app 四大组件:activity,content provider,      services, broardcast receivers Content Resolver 激活 Content Provider You can start an      activity (or give it something new to do) by passi

android开发学习笔记000

使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个一直梦想走技术流的再疯狂一次.2014.08.06. 直奔主题——>android开发学习笔记001 android开发学习笔记000

【Android开发学习笔记】【第四课】基础控件的学习

通过一个简单的例子来学习下面几种控件: 1.TextView:简单的文本显示控件 2.EditText:可以编辑的文本框 3.Button:按钮 4.Menu:这里指的是系统的Menu 5.Toast:消息提示控件,类似于MFc的tip(不知道理解的对不对) 顺便用到上一次学习的多个Activity之间传递数据的技术,来做一个小的计算乘法的case 步骤: (1)主Activity 和显示结果的 Activity 都采用线性布局,下面是布局文件的源代码: <LinearLayout xmlns:

转 Android开发学习笔记:浅谈WebView

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法: 第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2

【转】Android开发学习笔记(一)——初识Android

对于一名程序员来说,“自顶向下”虽然是一种最普通不过的分析问题和解决问题的方式,但其却是简单且较为有效的一种.所以,将其应用到Android的学习中来,不至于将自己的冲动演变为一种盲目和不知所措. 根据“自顶向下”.“从整体到局部”的思想,我的基本学习思路是: 从全局入手,宏观的了解Android平台的架构 了解基于Android平台的应用程序的运行原理 了解环境的搭建,为后面结合实践来学习细节做准备 根据平台架构,从上层到下层,一层一层的了解其相关的具体内容,并通过实践来强化学习 市面上关于A