zoukankan      html  css  js  c++  java
  • Android项目实战手机安全卫士(02)

    目录

    • 项目结构图
    • 源代码
    • 运行结果
    • 项目源代码

    项目结构图

    V0101_01

    源代码

    清单 01.  SplashActivity.java

    package com.coderdream.mobilesafe.activity;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    
    import org.xmlpull.v1.XmlPullParserException;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.SharedPreferences;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.animation.AlphaAnimation;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.coderdream.mobilesafe.R;
    import com.coderdream.mobilesafe.domain.UpdateInfo;
    import com.coderdream.mobilesafe.engine.UpdateInfoParser;
    
    public class SplashActivity extends Activity {
    	private TextView tv_splash_version;
    
    	private UpdateInfo info;
    
    	private static final int GET_INFO_SUCCESS = 10;
    	private static final int SERVER_ERROR = 11;
    	private static final int SERVER_URL_ERROR = 12;
    	private static final int PROTOCOL_ERROR = 13;
    	private static final int IO_ERROR = 14;
    	private static final int XML_PARSE_ERROR = 15;
    	private static final int DOWNLOAD_SUCCESS = 16;
    	private static final int DOWNLOAD_ERROR = 17;
    	protected static final String TAG = "SplashActivity";
    	private long startTime;
    	private RelativeLayout rl_splash;
    	private long endTime;
    	private ProgressDialog pd;
    
    	private Handler handler = new Handler() {
    		public void handleMessage(android.os.Message msg) {
    			switch (msg.what) {
    			case XML_PARSE_ERROR:
    				Toast.makeText(getApplicationContext(), "xml解析错误", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			case IO_ERROR:
    				Toast.makeText(getApplicationContext(), "I/O错误", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			case PROTOCOL_ERROR:
    				Toast.makeText(getApplicationContext(), "协议不支持", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			case SERVER_URL_ERROR:
    				Toast.makeText(getApplicationContext(), "服务器路径不正确", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			case SERVER_ERROR:
    				Toast.makeText(getApplicationContext(), "服务器内部异常", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			case GET_INFO_SUCCESS:
    				String serverversion = info.getVersion();
    				String currentversion = getVersion();
    				if (currentversion.equals(serverversion)) {
    					Log.i(TAG, "版本号相同进入主界面");
    					// loadMainUI();
    				} else {
    					Log.i(TAG, "版本号不相同,升级对话框");
    					showUpdateDialog();
    				}
    				break;
    
    			case DOWNLOAD_SUCCESS:
    				Log.i(TAG, "文件下载成功");
    				// File file = (File) msg.obj;
    				// installApk(file);
    				break;
    			case DOWNLOAD_ERROR:
    				Toast.makeText(getApplicationContext(), "下载数据异常", Toast.LENGTH_LONG).show();
    				// loadMainUI();
    				break;
    			}
    		};
    	};
    
    	/**
    	 * 显示升级提示的对话框
    	 */
    	protected void showUpdateDialog() {
    		// 创建了对话框的构造器
    		AlertDialog.Builder builder = new Builder(this);
    		// 设置对话框的提示内容
    		builder.setIcon(getResources().getDrawable(R.drawable.notification));
    		// 设置升级标题
    		builder.setTitle("升级提示");
    		// 设置升级提示内容
    		builder.setMessage(info.getDescription());
    		// 创建下载进度条
    		pd = new ProgressDialog(SplashActivity.this);
    		// 设置进度条在显示时的提示消息
    		pd.setMessage("正在下载");
    		// 指定显示下载进度条为水平形状
    		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    		// 设置升级按钮
    		builder.setPositiveButton("升级", new OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				// loadMainUI();
    			}
    		});
    		builder.setNegativeButton("取消", new OnClickListener() {
    
    			public void onClick(DialogInterface dialog, int which) {
    				// loadMainUI();
    			}
    		});
    		builder.create().show();
    	}
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		// 设置为无标题栏
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		// 设置为全屏模式
    		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    		setContentView(R.layout.activity_splash);
    
    		rl_splash = (RelativeLayout) findViewById(R.id.rl_splash);
    		tv_splash_version = (TextView) findViewById(R.id.tv_splash_version);
    		tv_splash_version.setText("版本号:" + getVersion());
    
    		AlphaAnimation aa = new AlphaAnimation(0.3f, 1.0f);
    		aa.setDuration(2000);
    		rl_splash.startAnimation(aa);
    
    		// 1.连接服务器获取服务器上的配置信息.
    		new Thread(new CheckVersionTask()) {
    		}.start();
    	}
    
    	/**
    	 * 连网检查应用的版本号与服务端上的版本号是否相同
    	 * 
    	 * @author Administrator
    	 * 
    	 */
    	private class CheckVersionTask implements Runnable {
    
    		public void run() {
    			// 获取Sdcard下的config.xml文件,如果该文件不存在,那么将会自动创建该文件
    			SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
    			// 由sp对象来获取autoupdate所对应的boolean值,如果该键不存在,默认返回true
    			boolean autoupdate = sp.getBoolean("autoupdate", true);
    			// 自动更新没有开启
    			if (!autoupdate) {
    				try {
    					// 睡眠2秒钟的是为了播放动画
    					Thread.sleep(2000);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				// 睡眠2秒钟播放动画完毕后进入程序主界面
    				// loadMainUI();
    			}
    			startTime = System.currentTimeMillis();
    			Message msg = Message.obtain();
    			try {
    				// 获取服务端的配置信息的连接地址
    				String serverurl = getResources().getString(R.string.serverurl);
    				URL url = new URL(serverurl);
    				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    				conn.setRequestMethod("GET");// 设置请求方式
    				conn.setConnectTimeout(5000);
    				int code = conn.getResponseCode();// 获取响应码
    				if (code == 200) {// 响应码为200时,表示与服务端连接成功
    					InputStream is = conn.getInputStream();
    					info = UpdateInfoParser.getUpdateInfo(is);
    					endTime = System.currentTimeMillis();
    					long resulttime = endTime - startTime;
    					if (resulttime < 2000) {
    						try {
    							Thread.sleep(2000 - resulttime);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    					}
    
    					msg.what = GET_INFO_SUCCESS;
    					handler.sendMessage(msg);
    				} else {
    					// 服务器状态错误.
    					msg.what = SERVER_ERROR;
    					handler.sendMessage(msg);
    					endTime = System.currentTimeMillis();
    					long resulttime = endTime - startTime;
    					if (resulttime < 2000) {
    						try {
    							Thread.sleep(2000 - resulttime);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    					}
    				}
    
    			} catch (MalformedURLException e) {
    				e.printStackTrace();
    				msg.what = SERVER_URL_ERROR;
    				handler.sendMessage(msg);
    			} catch (ProtocolException e) {
    				msg.what = PROTOCOL_ERROR;
    				handler.sendMessage(msg);
    				e.printStackTrace();
    			} catch (IOException e) {
    				msg.what = IO_ERROR;
    				handler.sendMessage(msg);
    				e.printStackTrace();
    			} catch (XmlPullParserException e) {
    				msg.what = XML_PARSE_ERROR;
    				handler.sendMessage(msg);
    				e.printStackTrace();
    			}
    		}
    	}
    
    	/**
    	 * <pre>
    	 * 获取当前应用程序的版本号。 
    	 * 版本号存在于我们的APK中对应的清单文件中(直接解压APK后,即可看到对应的清单文件),
    	 * 版本号是manifest节点中的android:versionName="1.0" 
    	 * 当一个应用程序被装到手机后 ,该apk拷贝到手机的data/app目录下(也就是系统中),
    	 * 如图6。所以想得到版本号,我们需要拿到与系统相关的服务,就可以得到apk中的信息了
    	 * 
    	 * </pre>
    	 * 
    	 * @return
    	 */
    	private String getVersion() {
    		// 得到系统的包管理器。已经得到了apk的面向对象的包装
    		PackageManager pm = this.getPackageManager();
    		try {
    			// 参数一:当前应用程序的包名 参数二:可选的附加消息,这里我们用不到 ,可以定义为0
    			PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
    			// 返回当前应用程序的版本号
    			return info.versionName;
    		} catch (Exception e) {// 包名未找到的异常,理论上, 该异常不可能会发生
    			e.printStackTrace();
    			return "";
    		}
    	}
    }

    清单 02. UpdateInfo.java

    package com.coderdream.mobilesafe.domain;
    
    public class UpdateInfo {
    	private String version;
    	private String description;
    	private String apkurl;
    
    	public String getVersion() {
    		return version;
    	}
    
    	public void setVersion(String version) {
    		this.version = version;
    	}
    
    	public String getDescription() {
    		return description;
    	}
    
    	public void setDescription(String description) {
    		this.description = description;
    	}
    
    	public String getApkurl() {
    		return apkurl;
    	}
    
    	public void setApkurl(String apkurl) {
    		this.apkurl = apkurl;
    	}
    }

    清单 03. UpdateInfoParser.java

    package com.coderdream.mobilesafe.engine;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    
    import android.util.Xml;
    
    import com.coderdream.mobilesafe.domain.UpdateInfo;
    
    /**
     * 
     * 解析XML数据
     * 
     */
    public class UpdateInfoParser {
    	/**
    	 * @param is
    	 *            xml文件的输入流
    	 * @return updateinfo的对象
    	 * @throws XmlPullParserException
    	 * @throws IOException
    	 */
    	public static UpdateInfo getUpdateInfo(InputStream is) throws XmlPullParserException, IOException {
    		// 获得一个Pull解析的实例
    		XmlPullParser parser = Xml.newPullParser();
    		// 将要解析的文件流传入
    		parser.setInput(is, "UTF-8");
    		// 创建UpdateInfo实例,用于存放解析得到的xml中的数据,最终将该对象返回
    		UpdateInfo info = new UpdateInfo();
    		// 获取当前触发的事件类型
    		int type = parser.getEventType();
    		// 使用while循环,如果获得的事件码是文档结束的话,那么就结束解析
    		while (type != XmlPullParser.END_DOCUMENT) {
    			if (type == XmlPullParser.START_TAG) {// 开始元素
    				if ("version".equals(parser.getName())) {// 判断当前元素是否是读者需要检索的元素,下同
    					// 因为内容也相当于一个节点,所以获取内容时需要调用parser对象的nextText()方法才可以得到内容
    					String version = parser.nextText();
    					info.setVersion(version);
    				} else if ("description".equals(parser.getName())) {
    					String description = parser.nextText();
    					info.setDescription(description);
    				} else if ("apkurl".equals(parser.getName())) {
    					String apkurl = parser.nextText();
    					info.setApkurl(apkurl);
    				}
    			}
    			type = parser.next();
    		}
    		return info;
    	}
    }

    清单 03. config.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <string name="serverurl">http://192.168.0.101:8080/info.xml</string>
    
    </resources>

    运行结果

    V0101_02

    工程源代码

    地址:http://download.csdn.net/detail/xuxiheng/8147099

  • 相关阅读:
    java中的自动拆装箱详解
    Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
    2019 安易迅java面试笔试题 (含面试题解析)
    2019 农信互联java面试笔试题 (含面试题解析)
    2019 博盾习言java面试笔试题 (含面试题解析)
    2019 蓝鲸人java面试笔试题 (含面试题解析)
    2019 上海轻轻java面试笔试题 (含面试题解析)
    2019 苏州朗动java面试笔试题 (含面试题解析)
    2019 医渡云java面试笔试题 (含面试题解析)
    2019 海看java面试笔试题 (含面试题解析)
  • 原文地址:https://www.cnblogs.com/ctoroad/p/4090758.html
Copyright © 2011-2022 走看看