1,主activity_splash:
成都創(chuàng)新互聯(lián) - 服務(wù)器主機(jī)托管,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽(yáng)服務(wù)器托管,德陽(yáng)服務(wù)器托管,遂寧服務(wù)器托管,綿陽(yáng)服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),服務(wù)器主機(jī)托管,西南服務(wù)器托管,四川/成都大帶寬,機(jī)柜大帶寬租用·托管,四川老牌IDC服務(wù)商
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/launcher_bg"//設(shè)置初始背景圖片
tools:context=".SplashActivity" >
<TextView
android:id="@+id/tv_version_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"#把這個(gè)textview 放到中間
android:shadowDx="1//這個(gè)指的是相對(duì)于原字體在x方向上的偏移量
android:shadowDy="1"
android:shadowColor="#f00"//黑色
android:shadowRadius="1"//表示陰影的模糊程度
android:textSize="16sp"
android:text="版本名稱" />
<ProgressBar //加載滾動(dòng)條
android:layout_below="@id/tv_version_name"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
2,副activity_home
<?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>
3,讓第二個(gè)活動(dòng)可以啟動(dòng)
<activity
android:name="com.example.moblesafe73.HomeActivity"/>
4,接下來(lái)創(chuàng)造兩個(gè)工具類,
一個(gè)是將流轉(zhuǎn)化為字符串
mport java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamUtil {
public static String StreamToString(InputStream is) {
//1.在讀取的過(guò)程中,將讀取的內(nèi)容存取到緩存中,然后一次性用字符轉(zhuǎn)化成字符串
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//2.讀取操作,讀到?jīng)]有為止(循環(huán))
byte[] buffer=new byte[1024];
//3.記錄讀取內(nèi)容的臨時(shí)變量
int temp=-1;
try {
while((temp=is.read(buffer))!=-1){
bos.write(buffer,0,temp);
}
//返回讀取的數(shù)據(jù)
return bos.toString();
} catch (IOException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}finally{
try {
is.close();
bos.close();
} catch (IOException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}
}
return null;
}
}
另一個(gè)是可以彈出toast
import android.content.Context;
import android.widget.Toast;
public class ToastUtils {
public static void show(Context ctx,String msg){
Toast.makeText(ctx, msg, 0).show();
}
}
5,主營(yíng)業(yè)務(wù)的介紹:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除當(dāng)前activity頭title
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
//初始化ui
initUI();
//初始化方法
initData();
}
6,關(guān)于如何初始化ui
private void initUI() {
// TODO 自動(dòng)生成的方法存根
tv_version_name = (TextView) findViewById(R.id.tv_version_name);
}
找到相應(yīng)控件
private void initData() {
// TODO 自動(dòng)生成的方法存根
//應(yīng)用版本名稱
tv_version_name.setText(getVersionName());
//獲取本地服務(wù)版本號(hào)
myLockVersionCode = getVersionCode();
//獲取服務(wù)器版本號(hào)(客戶端發(fā)請(qǐng)求,服務(wù)器給相應(yīng)(json,xml一般用的是json))
checkVersion();
}
//返回版本號(hào)
private int getVersionCode() {
// TODO 自動(dòng)生成的方法存根
//1,包管理者對(duì)象packagemanager
PackageManager pm=getPackageManager();
//2,從包的管理者對(duì)象中,獲取指定包名的基本信息(版本名稱,版本號(hào),0代表基本信息)
try {
PackageInfo packageinfo=pm.getPackageInfo(getPackageName(), 0);
return packageinfo.versionCode;
} catch (NameNotFoundException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}
return 0;
}
這個(gè)方法可以

再來(lái)看checkVersion();方法
如果上網(wǎng)的話需要用到線程方面的知識(shí)
private void checkVersion() {
new Thread(){
public void run(){
//Message message=new Message();
Message msg=Message.obtain();
long startTime=System.currentTimeMillis();//程序開始的時(shí)間
try {
//封裝url地址
URL url=new URL("http://192.168.1.104:8080/update74.json");
//開啟一個(gè)地址
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
//3,設(shè)置常見的請(qǐng)求參數(shù)(請(qǐng)求頭)
//請(qǐng)求超時(shí)
connection.setConnectTimeout(2000);
//讀取超時(shí)
connection.setReadTimeout(2000);
//默認(rèn)是get請(qǐng)求
//connection.setRequestMethod("POST");
//獲取請(qǐng)求響應(yīng)碼
if(connection.getResponseCode()==200){
//5.以流的形式,將數(shù)據(jù)保存起來(lái)
InputStream is=connection.getInputStream();
//6.將流換成字符串(工具類封裝)
String json=StreamUtil.StreamToString(is);
Log.i(tag, json);//打印日志
//7.json解析
JSONObject jsonObject=new JSONObject(json);
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,比對(duì)版本號(hào)(服務(wù)器版本號(hào),提示用戶更新)
if(myLockVersionCode <Integer.parseInt(versionCode)){
//提示用戶更新,彈出對(duì)話框
msg.what=UPDATE_VERSION;
}else{
//進(jìn)入應(yīng)用程序主界面
msg.what=ENTER_HOME;
}
}
}catch (MalformedURLException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
msg.what=URL_ERROR;
}catch (IOException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
msg.what=IO_ERROR;
} catch (JSONException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
msg.what=JSON_ERROR;
}finally{
//請(qǐng)求網(wǎng)絡(luò)的時(shí)長(zhǎng)超過(guò)四秒則不做處理
//請(qǐng)求小于四秒,強(qiáng)制讓其睡眠四秒
long endTime=System.currentTimeMillis();
if(endTime-startTime<4000)
{
try {
Thread.sleep(4000-(endTime-startTime));
} catch (InterruptedException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}
}
mhandler.sendMessage(msg);
}
};
}.start();
對(duì)上述信息進(jìn)行相關(guān)的處理:
private Handler mhandler=new Handler(){
public void handleMessage(android.os.Message msg){
switch(msg.what){
case UPDATE_VERSION:
//彈出對(duì)話框,提示用戶更新
showUpdateDialog();//彈出一個(gè)對(duì)話框,讓我們進(jìn)行更新
break;
case ENTER_HOME:
enterHome();
break;
case IO_ERROR:
ToastUtils.show(getApplicationContext(), "IO異常");
enterHome();
break;
case URL_ERROR:
ToastUtils.show(getApplicationContext(), "url異常");
enterHome();
break;
case JSON_ERROR:
ToastUtils.show(getApplicationContext(), "URL異常");//SplashActivity.this
enterHome();
break;
}
}
};
protected void showUpdateDialog() {
// TODO 自動(dòng)生成的方法存根
//對(duì)話框是依賴activity存在的
Builder builder = new AlertDialog.Builder(this);//必須用this,而不是getApplicationContext()
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("版本更新");
//設(shè)置描述內(nèi)容
builder.setMessage(mversionDes);//這個(gè)描述內(nèi)容見上文是由其發(fā)送過(guò)來(lái)的
//積極按鈕,立即更新
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//下載apk,apk鏈接地址,downloadUrl
downloadApk();
}
});//創(chuàng)建兩個(gè)按鈕監(jiān)聽器
builder.setNegativeButton("稍后再說(shuō)", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//取消對(duì)話框,進(jìn)入主界面
enterHome();
}
});
builder.show();
}
接下來(lái)是對(duì)文件進(jìn)行下載
protected void downloadApk() {
//apk下載鏈接地址,放置apk的所在路徑
//1,判斷sd卡是否可用,是否掛在上
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//2,獲取sd卡路徑
String path=Environment.getExternalStorageDirectory().getAbsolutePath()
+File.separator+"mobilesafe73.apk";
//發(fā)送請(qǐng)求,獲取sdk,并且添加到指定路徑
HttpUtils httpUtils=new HttpUtils();
//發(fā)送請(qǐng)求,傳遞參數(shù)吧(下載應(yīng)用放置的位置)
httpUtils.download(mdownloadUrl, path,new RequestCallBack<File>() {//mdownloadUrl剛才所獲得的下載的地址
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
Log.i(tag, "下載成功");
// TODO 自動(dòng)生成的方法存根
File file=responseInfo.result;
//提示用戶安裝
installAPK(file);
}
@Override
public void onFailure(HttpException arg0, String arg1) {
Log.i(tag, "下載失敗");
// TODO 自動(dòng)生成的方法存根
}
@Override
public void onStart() {
// TODO 自動(dòng)生成的方法存根
Log.i(tag, "開始下載");
super.onStart();
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
// TODO 自動(dòng)生成的方法存根
Log.i(tag, "下載中........");
Log.i(tag, "total = "+total);
Log.i(tag, "current = "+current);
super.onLoading(total, current, isUploading);
}
});
}
}
//開始安裝
protected void installAPK(File file) {
// TODO 自動(dòng)生成的方法存根
//系統(tǒng)應(yīng)用界面,源碼,安裝apk入口
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
/*//文件作為數(shù)據(jù)源
intent.setData(Uri.fromFile(file));
//設(shè)置安裝的類型
intent.setType("application/vnd.android.package-archive");*/
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
// startActivity(intent);
startActivityForResult(intent, 0);
}
//開啟另一個(gè)界面
protected void enterHome() {
Intent intent = new Intent(this,HomeActivity.class);
startActivity(intent);
//在開啟一個(gè)新的界面后將導(dǎo)航界面關(guān)閉,因?yàn)閷?dǎo)航界面只可見一次
finish();
}
分享題目:Android項(xiàng)目開發(fā)基礎(chǔ)再回顧(一)
URL標(biāo)題:http://chinadenli.net/article14/pgjjde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)