手机卫士02-与服务器交互

好啦,我们继续我们昨天的那个项目,昨天我们只完成了一个程序启动时的欢迎界面,但是提到了,启动那个界面时会进行版本的检查,所以今天我们就做那个版本的检查那一块。

既然要做版本检查,那肯定要有服务器啦,所以我们就用到tomcat啦,因为这个项目是Android, 所以我就不写那个服务器端的程序啦,我只用tomcat来进行一个简单的从服务器读取数据,然后更新程序。不会专门写一个服务器端来进行业务的处理。

好,废话不多说,可能有些人还没接触过Web方面的,所以我把tomcat的搭建也简单的说一下,大神可以直接跳到下面去。

首先,我们去tomcat官网上下载一个tomcat 下载地址

手机卫士02-与服务器交互

在这里选择是32位的还是64位的


下载下来后,安装也很简单,直接解压出来就行啦(前提是你的java环境要正确)

解压好之后,我们就可以去到它的bin目录下面,双击那个startup.bat文件啦

手机卫士02-与服务器交互


然后我们就会看到一个黑呼呼的界面

手机卫士02-与服务器交互


然后,我们去浏览器输入 http://localhost:8080/  然后出现下面的界面,那就说明你的tomcat配置成功了

手机卫士02-与服务器交互


那么,我们的服务器配置好之后,我们就要用它来为我们的app做一些东西啦

首先,我们在tomcat的webapps目录下载新建一个文件夹叫Security(这个是个人喜欢的,因为我们app叫Security)

手机卫士02-与服务器交互

update.xml里面的内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <update>
  3.         <version>1.0</version>
  4.         <description>这里写一些这个版本的特点</description>
  5.         <apkurl>http://192.168.1.5:8080/Security/new.apk</apkurl>
  6.         <!--这里的ip地址一定要写你服务器所在的电脑的ip地址,我们会在Security这个目录下面放置一下new.apk的,用来更新的-->
  7. </update>

复制代码
好啦,现在测试一下,在浏览器里面输入http://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">http://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,那样就会提示下载的啦,今天的代码有点多,而且有点乱,所以如果有什么不明白的,或出了什么问题的,都可以留言交流,最后提示一个,记得要把服务器打开再测试,不然就没效果啦手机卫士02-与服务器交互Security_02_服务器端的交互.rar(733.38 KB, 下载次数: 396)
上一篇:android多线程下载1


下一篇:支持OSS的群晖nas开箱体验(内部冒死流出,42张美图)