1、解析json數據
解析json的代碼很簡單
Java代碼
- 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的版本號,通過和客戶端的版本號進行對比
Java代碼
- //比對版本號(服務器版本號>本地版本號,提示用戶更新)
- if(mLocalVersionCode < Integer.parseInt(versionCode)) {
- //提示用戶更新,彈出對話框(UI),消息機制
- msg.what = UPDATE_VERSION;
-
- } else {
- //進入應用程序主界面
- msg.what = ENTER_HOME;
- }
可以使用android的消息機制發送不同類型消息,可以參考《Android消息機制入門》
首先新建Handler
Java代碼
- 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;
- }
- };
- };
在定義一些出現狀態碼和出現異常時候的錯誤碼:
Java代碼
- /**
- * 更新新版本的狀態碼
- */
- 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()函數,作用:跳轉到主界面
Java代碼
- /**
- * 進入應用程序主界面
- */
- protected void enterHome() {
- Intent intent = new Intent(this, HomeActivity.class);
- startActivity(intent);
- //在開啟一個新的界面後,將導航界面關閉(導航界面只可見一次)
- finish();
- }
所以順便新建一個HomeActivity.java
Java代碼
- public class HomeActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_home);
- }
- }
當然還有一個activity_home.xml文件,隨便加一點代碼,先看到效果,後期再修改
XML/HTML代碼
- <?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界面
Java代碼
- //指定睡眠時間,請求網絡的時長超過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);
完整的代碼如下:
Java代碼
- 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);
- }
-
- }