閱讀828 返回首頁    go 阿裏雲 go 技術社區[雲棲]


手機衛士02-與服務器交互

好啦,我們繼續我們昨天的那個項目,昨天我們隻完成了一個程序啟動時的歡迎界麵,但是提到了,啟動那個界麵時會進行版本的檢查,所以今天我們就做那個版本的檢查那一塊。

既然要做版本檢查,那肯定要有服務器啦,所以我們就用到tomcat啦,因為這個項目是Android, 所以我就不寫那個服務器端的程序啦,我隻用tomcat來進行一個簡單的從服務器讀取數據,然後更新程序。不會專門寫一個服務器端來進行業務的處理。

好,廢話不多說,可能有些人還沒接觸過Web方麵的,所以我把tomcat的搭建也簡單的說一下,大神可以直接跳到下麵去。

首先,我們去tomcat官網上下載一個tomcat 下載地址

在這裏選擇是32位的還是64位的


下載下來後,安裝也很簡單,直接解壓出來就行啦(前提是你的java環境要正確)

解壓好之後,我們就可以去到它的bin目錄下麵,雙擊那個startup.bat文件啦


然後我們就會看到一個黑唿唿的界麵


然後,我們去瀏覽器輸入 https://localhost:8080/  然後出現下麵的界麵,那就說明你的tomcat配置成功了


那麼,我們的服務器配置好之後,我們就要用它來為我們的app做一些東西啦

首先,我們在tomcat的webapps目錄下載新建一個文件夾叫Security(這個是個人喜歡的,因為我們app叫Security)

update.xml裏麵的內容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <update>
  3.         <version>1.0</version>
  4.         <description>這裏寫一些這個版本的特點</description>
  5.         <apkurl>https://192.168.1.5:8080/Security/new.apk</apkurl>
  6.         <!--這裏的ip地址一定要寫你服務器所在的電腦的ip地址,我們會在Security這個目錄下麵放置一下new.apk的,用來更新的-->
  7. </update>

複製代碼
好啦,現在測試一下,在瀏覽器裏麵輸入https://localhost:8080/Security/update.xml  如果能夠看到我們剛剛寫的update.xml裏麵的內容,那麼,你的服務器就配置成功啦!先恭喜你,你又會弄服務器啦!!!!!ps:因為這個要涉及服務器這些知識,所以我們這個app運行的手機上的ip一定要和你運行tomcat那台電腦上的ip是處於同一個局域網的,當時如果有外部ip那就不同,所以最好就是電腦和手機接同一個wifi這個一般會在同一個局域網啦,當然,用模擬器就一定是在同一個局域網啦 好啦,配置好了服務器後,我們就可以繼續我們的項目啦,因為要和服務器交互,那麼,我們肯定要把交互的地址存起來的啦,所以我們在我們的項目的values目錄下新建一個config.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.    
  4.     <string name="serverUrl">https://192.168.1.5:8080/Security/update.xml</string>
  5.    
  6. </resources>

複製代碼
好啦,現在,我們的任務是從服務器上讀取到update.xml裏麵的內容,然後再解析它,拿到apk的下載地址,和最新的版本與當時的版本比較嘛,看一下要不要下載,所以我們就要有一個model來存放這些更新的信息了嘛所以我們就新建一個類com.xiaobin.security.domain.UpdateInfo
  1. package com.xiaobin.security.domain;

  2. public class UpdateInfo
  3. {
  4.         private String version;
  5.         private String description;
  6.         private String url;
  7.        
  8.         public String getVersion()
  9.         {
  10.                 return version;
  11.         }
  12.         public void setVersion(String version)
  13.         {
  14.                 this.version = version;
  15.         }
  16.         public String getDescription()
  17.         {
  18.                 return description;
  19.         }
  20.         public void setDescription(String description)
  21.         {
  22.                 this.description = description;
  23.         }
  24.         public String getUrl()
  25.         {
  26.                 return url;
  27.         }
  28.         public void setUrl(String url)
  29.         {
  30.                 this.url = url;
  31.         }
  32.        
  33. }

複製代碼
然後呢,我們要從服務器上讀取到一個update.xml嘛,所以我們也要新建一個類,用來與服務器交互啦所以新建一個類com.xiaobin.security.engine.UpdateInfoService
  1. package com.xiaobin.security.engine;

  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;

  5. import android.content.Context;

  6. import com.xiaobin.security.domain.UpdateInfo;

  7. public class UpdateInfoService
  8. {
  9.        
  10.         private Context context;
  11.        
  12.         public UpdateInfoService(Context context)
  13.         {
  14.                 this.context = context;
  15.         }
  16.        
  17.         public UpdateInfo getUpdateInfo(int urlId) throws Exception
  18.         {
  19.                 String path = context.getResources().getString(urlId);//拿到config.xml裏麵存放的地址
  20.                 URL url = new URL(path);
  21.                 HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();//開啟一個http鏈接
  22.                 httpURLConnection.setConnectTimeout(5000);//設置鏈接的超時時間,現在為5秒
  23.                 httpURLConnection.setRequestMethod("GET");//設置請求的方式
  24.                 InputStream is = httpURLConnection.getInputStream();//拿到一個輸入流。裏麵包涵了update.xml的信息
  25.                 return UpdateInfoParser.getUpdateInfo(is);//解析xml
  26.         }

  27. }

複製代碼
剛剛上麵那個類裏麵有一個解析xml的操作,所以我們現在把解析xml的這個類也寫一下所以新建一個類com.xiaobin.security.engine.UpdateInfoParser
  1. package com.xiaobin.security.engine;

  2. import java.io.InputStream;

  3. import org.xmlpull.v1.XmlPullParser;

  4. import android.util.Xml;

  5. import com.xiaobin.security.domain.UpdateInfo;

  6. public class UpdateInfoParser
  7. {
  8.        
  9.         public static UpdateInfo getUpdateInfo(InputStream is) throws Exception
  10.         {
  11.                 UpdateInfo info = new UpdateInfo();
  12.                 XmlPullParser xmlPullParser = Xml.newPullParser();
  13.                 xmlPullParser.setInput(is, "utf-8");
  14.                 int type = xmlPullParser.getEventType();
  15.                 while(type != XmlPullParser.END_DOCUMENT)
  16.                 {
  17.                         switch(type)
  18.                         {
  19.                                 case XmlPullParser.START_TAG :
  20.                                         if(xmlPullParser.getName().equals("version"))
  21.                                         {
  22.                                                 info.setVersion(xmlPullParser.nextText());
  23.                                         }
  24.                                         else if(xmlPullParser.getName().equals("description"))
  25.                                         {
  26.                                                 info.setDescription(xmlPullParser.nextText());
  27.                                         }
  28.                                         else if(xmlPullParser.getName().equals("apkurl"))
  29.                                         {
  30.                                                 info.setUrl(xmlPullParser.nextText());
  31.                                         }
  32.                                         break;
  33.                                        
  34.                                 default :
  35.                                         break;
  36.                         }
  37.                         type = xmlPullParser.next();
  38.                 }
  39.                 return info;
  40.         }

  41. }

複製代碼
好啦,現在我們回去給我們昨天寫的那個SplashActivity加上一些邏輯啦
  1. package com.xiaobin.security.ui;

  2. import android.app.Activity;
  3. import android.app.AlertDialog;
  4. import android.content.DialogInterface;
  5. import android.content.pm.PackageInfo;
  6. import android.content.pm.PackageManager;
  7. import android.content.pm.PackageManager.NameNotFoundException;
  8. import android.os.Bundle;
  9. import android.view.Window;
  10. import android.view.WindowManager;
  11. import android.view.animation.AlphaAnimation;
  12. import android.widget.LinearLayout;
  13. import android.widget.TextView;
  14. import android.widget.Toast;

  15. import com.xiaobin.security.R;
  16. import com.xiaobin.security.domain.UpdateInfo;
  17. import com.xiaobin.security.engine.UpdateInfoService;

  18. public class SplashActivity extends Activity
  19. {
  20.         private TextView tv_version;
  21.         private LinearLayout ll;
  22.        
  23.         private UpdateInfo info;
  24.        
  25.         @Override
  26.         protected void onCreate(Bundle savedInstanceState)
  27.         {
  28.                 super.onCreate(savedInstanceState);
  29.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  30.                 setContentView(R.layout.splash);
  31.                 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  32.                
  33.                 tv_version = (TextView) findViewById(R.id.tv_splash_version);
  34.                 String version = getVersion();
  35.                 tv_version.setText("版本號  " + version);
  36.                
  37.                 ll = (LinearLayout) findViewById(R.id.ll_splash_main);
  38.                 AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
  39.                 alphaAnimation.setDuration(2000);
  40.                 ll.startAnimation(alphaAnimation);
  41.                
  42.                 if(isNeedUpdate(version))
  43.                 {
  44.                         showUpdateDialog();
  45.                 }
  46.         }
  47.        
  48.         private void showUpdateDialog()
  49.         {
  50.                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
  51.                 builder.setIcon(android.R.drawable.ic_dialog_info);
  52.                 builder.setTitle("升級提醒");
  53.                 builder.setMessage(info.getDescription());
  54.                 builder.setCancelable(false);
  55.                
  56.                 builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
  57.                 {
  58.                        
  59.                         @Override
  60.                         public void onClick(DialogInterface dialog, int which)
  61.                         {
  62.                                 // TODO Auto-generated method stub
  63.                                
  64.                         }
  65.                 });
  66.                 builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
  67.                 {

  68.                         @Override
  69.                         public void onClick(DialogInterface dialog, int which)
  70.                         {
  71.                                 // TODO Auto-generated method stub
  72.                                
  73.                         }
  74.                        
  75.                 });
  76.                 builder.create().show();
  77.         }

  78.         private boolean isNeedUpdate(String version)
  79.         {
  80.                 UpdateInfoService updateInfoService = new UpdateInfoService(this);
  81.                 try
  82.                 {
  83.                         info = updateInfoService.getUpdateInfo(R.string.serverUrl);
  84.                         String v = info.getVersion();
  85.                         if(v.equals(version))
  86.                         {
  87.                                 System.out.println("不用更新");
  88.                                 return false;
  89.                         }
  90.                         else
  91.                         {
  92.                                 System.out.println("要更新");
  93.                                 return true;
  94.                         }
  95.                 }
  96.                 catch (Exception e)
  97.                 {
  98.                         e.printStackTrace();
  99.                         Toast.makeText(this, "獲取更新信息異常,請稍後再試", Toast.LENGTH_SHORT).show();
  100.                 }
  101.                 return false;
  102.         }

  103.         private String getVersion()
  104.         {
  105.                 try
  106.                 {
  107.                         PackageManager packageManager = getPackageManager();
  108.                         PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
  109.                        
  110.                         return packageInfo.versionName;
  111.                 }
  112.                 catch (NameNotFoundException e)
  113.                 {
  114.                         e.printStackTrace();
  115.                         return "版本號未知";
  116.                 }
  117.         }

  118. }

複製代碼
因為我們訪問了Internet。所以要在AndroidManifest裏麵加上權限
  1. <uses-permission android:name="android.permission.INTERNET"/>
複製代碼
好啦,現在可以進行測試一下啦,隻要修改update.xml裏麵的那個version,那樣就會提示下載的啦,今天的代碼有點多,而且有點亂,所以如果有什麼不明白的,或出了什麼問題的,都可以留言交流,最後提示一個,記得要把服務器打開再測試,不然就沒效果啦Security_02_服務器端的交互.rar(733.38 KB, 下載次數: 396)

最後更新:2017-04-03 14:54:27

  上一篇:go 劍指Offer之合並兩個排序的鏈表
  下一篇:go GCC功能及使用