編輯:關於android開發
本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,轉載請注明源地址。
解析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);
在獲取服務器端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); } }
Android安全專項-利用androguard分析微信 安裝 做 Android 安全測試之前你應該知道的工具 (一) 分析 ./androlyze.py -s進入
Android 手機衛士17--緩存清理,android17-- 清理單個應用緩存 通過反射調用方法 需要權限:android.permissi
android:Activity數據傳遞之全局對象(application) 在activity之間數據傳遞中還有一種比較實用的方式,就是全局對象applicatio
Fragment一般是宿主Activity UI的一部分或一種行為,作為Act
Android界面架構(Activity,PhoneWiondow,De