一.splash界面的作用
- 用來(lái)展現(xiàn)產(chǎn)品的Logo
- 應(yīng)用程序初始化的操作
- 檢查應(yīng)用程序的版本
- 檢查當(dāng)前應(yīng)用程序是否合法注冊(cè)
二、界面的xml定義
寫(xiě)一個(gè)布局背景設(shè)置為產(chǎn)品的logo圖片,再添加一個(gè)textview顯示版本號(hào)。
<TextView
android:id="@+id/tv_splash_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textStyle="bold"
android:shadowDx="1"http://陰影的偏移量
android:shadowDy="1"
android:shadowRadius="0.2"http://陰影的半徑
android:shadowColor="#ffff00"
android:text="版本:1.0"
android:textSize="16sp"
android:layout_centerInParent="true"/>
三、動(dòng)態(tài)獲取版本號(hào)的方法
public String getAppVersion(){
PackageManager pm = getPackageManager();
try {
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
return info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
//不可能發(fā)生;
return "";
}
}
四、鏈接服務(wù)器獲取更新信息
-
升級(jí)提醒的對(duì)話框
protected void showUpdateDialog() { AlertDialog.Builder build = new Builder(this); build.setTitle("發(fā)現(xiàn)新版本"); build.setMessage(description); build.setNegativeButton("立刻升級(jí)", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //升級(jí)的代碼; }; }); build.setPositiveButton("下次再說(shuō)", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); enterHome(); } }); build.show(); -
在子線程中請(qǐng)求服務(wù)器的代碼 checkup()方法
private void checkup() { new Thread() { public void run() { Message msg = Message.obtain(); long startTime = System.currentTimeMillis();//啟動(dòng)該線程的系統(tǒng)時(shí)間 try { //請(qǐng)求網(wǎng)絡(luò)的代碼 URL url = new URL(getString(R.string.serverurl)); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET");//請(qǐng)求方法 conn.setConnectTimeout(4000);//超時(shí)時(shí)間 int code = conn.getResponseCode();//返回碼200請(qǐng)求成功 if (code == 200) { InputStream is = conn.getInputStream(); String result = StreamTools.readFromStream(is); Log.i(TAG, "聯(lián)網(wǎng)成功" + result); JSONObject obj = new JSONObject(result);//解析json字符串 String version = (String) obj.get("version");//版本信息 description = (String) obj.get("description");//描述信息 apkurl = (String) obj.get("apkurl"); if (getAppVersion().equals(version)) { msg.what = ENTER_HOME; } else { msg.what = SHOW_UPDATE_DIALOG; } } } catch (MalformedURLException e) { e.printStackTrace(); msg.what = URL_ERROR; } catch (IOException e) { e.printStackTrace(); msg.what = NETWORK_ERROR; } catch (JSONException e) { e.printStackTrace(); msg.what = JSON_ERROR; } finally { handler.sendMessage(msg); long endTime = System.currentTimeMillis();//該線程執(zhí)行完畢的時(shí)間 long dTime = endTime-startTime;//該線程的阻塞時(shí)間 if (dTime<3000) { try { Thread.sleep(3000-dTime);//若該線程的阻塞時(shí)間小于三秒繼續(xù)睡眠到三秒 } catch (InterruptedException e) { e.printStackTrace(); } } } } }.start(); }
handler
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case SHOW_UPDATE_DIALOG:
showUpdateDialog();
break;
case ENTER_HOME:
Toast.makeText(getApplicationContext(), "", 0).show();
enterhome();
break;
case URL_ERROR:
Toast.makeText(getApplicationContext(), "URL_ERROR", 0).show();
enterhome();
break;
case NETWORK_ERROR:
Toast.makeText(getApplicationContext(), "NETWORK_ERROR", 0).show();
enterhome();
break;
case JSON_ERROR:
Toast.makeText(getApplicationContext(), "JSON_ERROR", 0).show();
enterhome();
break;
}
}
};
五、下載文件(使用Afinal框架)并調(diào)用系統(tǒng)安裝工具安裝APK
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
FinalHttp finalHttp = new FinalHttp();
finalHttp.download(apkurl,Environment.getExternalStorageDirectory().getAbsolutePath()+
"/mobilesafe2.0.apk" , new AjaxCallBack<File>() {
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
tv_uapdate_info.setVisibility(View.VISIBLE);
int progress =(int) (current*100/count);
tv_uapdate_info.setText("下載進(jìn)度:"+progress+"%");
}
@Override
public void onFailure(Throwable t, int errorNo,
String strMsg) {
t.printStackTrace();
Toast.makeText(getApplicationContext(), "下載失敗", 0).show();
enterhome();
super.onFailure(t, errorNo, strMsg);
}
@Override
public void onSuccess(File t) {
super.onSuccess(t);
installAPK(t);
}
private void installAPK(File t) {
Intent intent = new Intent();//自動(dòng)安裝程序可調(diào)用該段代碼
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");
startActivity(intent);
}
});
}else{
Toast.makeText(getApplicationContext(), "請(qǐng)插入內(nèi)存卡再試",0).show();
return;
}
其他:
1、顯示4.0的樣式:方式是去掉功能清單里的Activity對(duì)應(yīng)的android:theme;
放到application里面;
2、當(dāng)splash頁(yè)面彈出升級(jí)提示框過(guò)濾點(diǎn)擊返回的是兩種方式:
builder.setCancelable(false);
設(shè)置setOnCancelListener 當(dāng)觸屏的時(shí)候直接進(jìn)入主頁(yè)面
對(duì)話框是掛載在Activity上面的,如果Activity不存在,對(duì)話框就不能被創(chuàng)建。
getApplicationContext();生命周期長(zhǎng),只要應(yīng)用還存活它就存在;this 生命周期短,只要Activity不存在了,系統(tǒng)就會(huì)回收
其中:getBaseContext(),getApplication(),getApplicationContext(); 都不能放在AlertDialog做上下文;