【手机安全卫士02】连接服务器获取更新信息

在上一篇文章中我们已经开发好了对应的启动页面,今天我们将继续开发进去启动页面时自动的连接服务器,获取服务器上的最新信息,如果服务器上的版本大于当前版本的话,则弹出对话框提示下载更新,否则直接进入主界面!下面是效果图:

【手机安全卫士02】连接服务器获取更新信息

 下面是SplashActivity的全部代码:

  1 package lq.wangzhen.mobilesafe;

  2 

  3 import java.io.IOException;

  4 import java.io.InputStream;

  5 import java.net.HttpURLConnection;

  6 import java.net.MalformedURLException;

  7 import java.net.URL;

  8 

  9 import lq.wangzhen.mobilesafe.domain.UpdateInfo;

 10 import lq.wangzhen.mobilesafe.engine.UpdateInfoParser;

 11 

 12 import org.xmlpull.v1.XmlPullParserException;

 13 

 14 import android.app.Activity;

 15 import android.app.AlertDialog;

 16 import android.app.AlertDialog.Builder;

 17 import android.content.DialogInterface;

 18 import android.content.DialogInterface.OnClickListener;

 19 import android.content.Intent;

 20 import android.content.pm.PackageInfo;

 21 import android.content.pm.PackageManager;

 22 import android.content.pm.PackageManager.NameNotFoundException;

 23 import android.os.Bundle;

 24 import android.os.Handler;

 25 import android.os.Message;

 26 import android.util.Log;

 27 import android.widget.TextView;

 28 import android.widget.Toast;

 29 

 30 public class SplashActivity extends Activity {

 31     private TextView tv_splash_version;

 32     private UpdateInfo info;

 33     

 34     private static final int GET_INFO_SUCCESS = 10;

 35     private static final int SERVER_ERROR = 11;

 36     private static final int SERVER_URL_ERROR = 12;

 37     private static final int IO_ERROR = 13;

 38     private static final int XML_PARSER_ERROR = 14;

 39     protected static final String TAG = "SplashActivity";

 40     

 41     private Handler handler = new Handler(){

 42 

 43         @Override

 44         public void handleMessage(Message msg) {

 45             switch (msg.what) {

 46             case XML_PARSER_ERROR:

 47                 Toast.makeText(getApplicationContext(), "XML解析异常", Toast.LENGTH_LONG).show();

 48                 loadMainUI();   //加载主界面

 49                 break;

 50             case IO_ERROR:

 51                 Toast.makeText(getApplicationContext(), "IO异常", Toast.LENGTH_LONG).show();

 52                 loadMainUI(); //加载主界面

 53                 break;

 54             case SERVER_URL_ERROR:

 55                 Toast.makeText(getApplicationContext(), "服务器URL出错", Toast.LENGTH_LONG).show();

 56                 loadMainUI(); //加载主界面

 57                 break;

 58             case SERVER_ERROR:

 59                 Toast.makeText(getApplicationContext(), "服务器异常", Toast.LENGTH_LONG).show();

 60                 loadMainUI();//加载主界面

 61                 break;

 62             case GET_INFO_SUCCESS:

 63                 String serverVersion = info.getVersion();   //取得服务器上的版本号

 64                 String currentVersion = getVersion();       //取得当前应用的版本号

 65                 if(currentVersion.equals(serverVersion)){   //判断两个版本号是否相同

 66                     Log.i(TAG, "版本号相同,进入主界面!");

 67                     loadMainUI();                //如果版本号相同,则进入主界面

 68                 }else{

 69                     Log.i(TAG, "版本号不相同,对话框!");

 70                     showUpdateDialog();                     //如果版本号不相同,则加载更新对话框

 71                 }

 72                 break;

 73 

 74             default:

 75                 break;

 76             }

 77         }

 78         

 79     };

 80     //加载主界面

 81     public void loadMainUI(){   

 82         Intent intent = new Intent(this,MainActivity.class);

 83         startActivity(intent);

 84         finish();   //结束当前的Activity

 85     }

 86     //显示升级对话框

 87     protected void showUpdateDialog() {

 88         AlertDialog.Builder builder = new Builder(this);    //实例化对话框

 89         builder.setIcon(getResources().getDrawable(R.drawable.notification));   //添加图标

 90         builder.setTitle("升级提示");   //添加标题

 91         builder.setMessage(info.getDescription());   //添加内容

 92         builder.setPositiveButton("升级", new OnClickListener() {    //点击升级时的操作方法

 93             @Override

 94             public void onClick(DialogInterface dialog, int which) {

 95                 Log.i(TAG, "升级,地址:"+info.getApkurl());

 96             }

 97         });

 98         builder.setNegativeButton("取消", new OnClickListener() {    //点击取消时的操作方法

 99             @Override

100             public void onClick(DialogInterface dialog, int which) {

101                 loadMainUI();

102             }

103         });

104         builder.create().show();   //显示对话框

105     }

106     @Override

107     protected void onCreate(Bundle savedInstanceState) {

108         super.onCreate(savedInstanceState);

109         setContentView(R.layout.activity_splash);

110         this.tv_splash_version = (TextView) this.findViewById(R.id.tv_splash_version);

111         this.tv_splash_version.setText("版本号:"+getVersion());   //设置应用程序的版本号

112         new Thread(new CheckVersionTask()){}.start();    //启动一个线程进行服务器连接判断版本号是否相同

113     }

114     

115     private class CheckVersionTask implements Runnable{

116         @Override

117         public void run() {

118             Message msg = Message.obtain();

119             //1、取得服务器地址

120             String serverUrl = getResources().getString(R.string.serverurl);   //取得服务器地址

121             //2、连接服务器

122             try {

123                 URL url = new URL(serverUrl);   

124                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();

125                 conn.setConnectTimeout(5000);

126                 conn.setRequestMethod("GET");

127                 int code = conn.getResponseCode();

128                 if(code == 200){

129                     InputStream is = conn.getInputStream();    //取得服务器返回的内容

130                     info = UpdateInfoParser.getUpdateInfo(is);   //调用自己编写的方法,将输入流转换为UpdateInfo对象

131                     msg.what = GET_INFO_SUCCESS;

132                     handler.sendMessage(msg);

133                 }else{

134                     msg.what = SERVER_ERROR;

135                     handler.sendMessage(msg);

136                 }

137             } catch (MalformedURLException e) {

138                 msg.what = SERVER_URL_ERROR;

139                 handler.sendMessage(msg);

140                 handler.sendMessage(msg);

141             } catch (IOException e) {

142                 msg.what = IO_ERROR;

143                 handler.sendMessage(msg);

144                 e.printStackTrace();

145             } catch (XmlPullParserException e) {

146                 msg.what = XML_PARSER_ERROR;

147                 handler.sendMessage(msg);

148                 e.printStackTrace();

149             }

150         }

151     }

152     /**

153      * 取得应用的版本号

154      * @return

155      */

156     public String getVersion(){

157         PackageManager pm = getPackageManager();   //取得包管理器的对象,这样就可以拿到应用程序的管理对象

158         try {

159             PackageInfo info = pm.getPackageInfo(getPackageName(), 0);   //得到应用程序的包信息对象

160             return info.versionName;   //取得应用程序的版本号

161         } catch (NameNotFoundException e) {

162             e.printStackTrace();

163             //此异常不会发生

164             return "";

165         }

166     }

167 }

 

以上代码中用到的UpdateInfoParser.getUpdateInfo()方法,如下:

 1 package lq.wangzhen.mobilesafe.engine;

 2 

 3 import java.io.IOException;

 4 import java.io.InputStream;

 5 

 6 import org.xmlpull.v1.XmlPullParser;

 7 import org.xmlpull.v1.XmlPullParserException;

 8 

 9 import android.util.Xml;

10 

11 import lq.wangzhen.mobilesafe.domain.UpdateInfo;

12 

13 public class UpdateInfoParser {

14 

15     public static UpdateInfo getUpdateInfo(InputStream is) throws XmlPullParserException, IOException{

16         XmlPullParser parser = Xml.newPullParser();   //取得XmlPullParser解析器,准备对XML进行解析

17         parser.setInput(is, "UTF-8");

18         UpdateInfo info = new UpdateInfo();    //实例化UpdateInfo对象

19         int type = parser.getEventType();

20         while(type != XmlPullParser.END_DOCUMENT){

21             if(type==XmlPullParser.START_TAG){

22                 if("version".equals(parser.getName())){

23                     String version = parser.nextText();

24                     info.setVersion(version);

25                 }else if("description".equals(parser.getName())){

26                     String description = parser.nextText();

27                     info.setDescription(description);

28                 }else if("apkurl".equals(parser.getName())){

29                     String apkurl = parser.nextText();

30                     info.setApkurl(apkurl);

31                 }

32             }

33             type = parser.next();

34         }

35         return info;

36     }

37 }

 

以上代码中用到的UpdateInfo类,此类是根据服务器中提供的info.xml对象编写的:

 1 package lq.wangzhen.mobilesafe.domain;

 2 

 3 public class UpdateInfo {

 4 

 5     private String version;   //服务器上的版本号

 6     private String description;  //升级信息

 7     private String apkurl;    //apk下载地址

 8     public String getVersion() {

 9         return version;

10     }

11     public void setVersion(String version) {

12         this.version = version;

13     }

14     public String getDescription() {

15         return description;

16     }

17     public void setDescription(String description) {

18         this.description = description;

19     }

20     public String getApkurl() {

21         return apkurl;

22     }

23     public void setApkurl(String apkurl) {

24         this.apkurl = apkurl;

25     }

26     

27     

28 }

 

在layout文件夹中新建立main.xml布局文件,作为应用程序的主界面,如下:

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 3     android:layout_width="match_parent"

 4     android:layout_height="match_parent"

 5     android:orientation="vertical" >

 6     

 7     <TextView 

 8         android:id="@+id/test"

 9         android:layout_width="wrap_content"

10         android:layout_height="wrap_content"

11         android:text="mainUI"/>

12 

13 </LinearLayout>

 

建立对应的MainActivity.java,加载main.xml:

 1 package lq.wangzhen.mobilesafe;

 2 

 3 import android.app.Activity;

 4 import android.os.Bundle;

 5 

 6 public class MainActivity extends Activity {

 7 

 8     @Override

 9     protected void onCreate(Bundle savedInstanceState) {

10         super.onCreate(savedInstanceState);

11         setContentView(R.layout.main);

12     }

13 

14 }

 

在mainfest.xml文件中配置MainActivity:

1 <activity android:name="lq.wangzhen.mobilesafe.MainActivity"></activity> 

 

因为要访问网络,别忘了加入访问网络的权限哦:

1 <uses-permission android:name="android.permission.INTERNET"/>

 对应的源码下载地址:http://pan.baidu.com/share/link?shareid=1241370091&uk=1646729842

 

 

 

 

你可能感兴趣的:(服务器)