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ù)商
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/launcher_bg"http://設(shè)置初始背景圖片 tools:context=".SplashActivity" > 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"http://黑色 android:shadowRadius="1"http://表示陰影的模糊程度 android:textSize="16sp" android:text="版本名稱" /> android:layout_below="@id/tv_version_name" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" />
2,副activity_home
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > android:text="HomeActivity" android:textSize="20sp" android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" />
3,讓第二個(gè)活動(dòng)可以啟動(dòng)
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();//程序開(kāi)始的時(shí)間 try { //封裝url地址 URL url=new URL("http://192.168.1.104:8080/update74.json"); //開(kāi)啟一個(gè)地址 HttpURLConnection connection=(HttpURLConnection)url.openConnection(); //3,設(shè)置常見(jiàn)的請(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 //提示用戶更新,彈出對(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)容見(jiàn)上文是由其發(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)聽(tīng)器 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 @Override public void onSuccess(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, "開(kāi)始下載"); 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); } }); } } //開(kāi)始安裝 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); } //開(kāi)啟另一個(gè)界面 protected void enterHome() { Intent intent = new Intent(this,HomeActivity.class); startActivity(intent); //在開(kāi)啟一個(gè)新的界面后將導(dǎo)航界面關(guān)閉,因?yàn)閷?dǎo)航界面只可見(jiàn)一次 finish(); }
文章名稱:Android項(xiàng)目開(kāi)發(fā)基礎(chǔ)再回顧(一)
分享鏈接:http://weahome.cn/article/pgjjde.html