學習完了四大組件 然後按照黑馬課程就是安全衛士了
四大組件學習之後感覺印象不是很深刻,所以趁着這個項目好好練習練習。
個人喜歡在註釋中描述所以就只姐連着註釋代碼和註釋一起貼上先!
首先是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();
}
}