闪屏页的布局

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;import org.json.JSONException;
import org.json.JSONObject;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.utils.StreamUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;public class SplashActivity extends Activity {protected static final int CODE_UPDATE_DIALOG = 0;protected static final int CODE_URL_ERROR = 1;protected static final int CODE_NET_ERROR = 2;protected static final int CODE_JSON_ERROR = 3;protected static final int CODE_ENTER_HOME = 4;// 进入主页面private TextView tvVersion;private TextView tvProgress;// 下载进度展示// 服务器返回的信息private String mVersionName;// 版本名private int mVersionCode;// 版本号private String mDesc;// 版本描述private String mDownloadUrl;// 下载地址private Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case CODE_UPDATE_DIALOG:showUpdateDailog();break;case CODE_URL_ERROR:Toast.makeText(SplashActivity.this, "url错误", Toast.LENGTH_SHORT).show();enterHome();break;case CODE_NET_ERROR:Toast.makeText(SplashActivity.this, "网络错误", Toast.LENGTH_SHORT).show();enterHome();break;case CODE_JSON_ERROR:Toast.makeText(SplashActivity.this, "数据解析错误",Toast.LENGTH_SHORT).show();enterHome();break;case CODE_ENTER_HOME:enterHome();break;default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_splash);tvVersion = (TextView) findViewById(R.id.tv_version);tvVersion.setText("版本名:" + getVersionName());tvProgress = (TextView) findViewById(R.id.tv_progress);// 默认隐藏checkVerson();}/*** 获取版本名称* * @return*/private String getVersionName() {PackageManager packageManager = getPackageManager();try {PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);// 获取包的信息int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;System.out.println("versionName=" + versionName + ";versionCode="+ versionCode);return versionName;} catch (NameNotFoundException e) {// 没有找到包名的时候会走此异常e.printStackTrace();}return "";}/*** 获取本地app的版本号* * @return*/private int getVersionCode() {PackageManager packageManager = getPackageManager();try {PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);// 获取包的信息int versionCode = packageInfo.versionCode;return versionCode;} catch (NameNotFoundException e) {// 没有找到包名的时候会走此异常e.printStackTrace();}return -1;}/*** 从服务器获取版本信息进行校验*/private void checkVerson() {final long startTime = System.currentTimeMillis();// 启动子线程异步加载数据new Thread() {@Overridepublic void run() {Message msg = Message.obtain();HttpURLConnection conn = null;try {// 本机地址用localhost, 但是如果用模拟器加载本机的地址时,可以用ip(10.0.2.2)来替换URL url = new URL("http://10.0.2.2:8080/update.json");conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");// 设置请求方法conn.setConnectTimeout(5000);// 设置连接超时conn.setReadTimeout(5000);// 设置响应超时, 连接上了,但服务器迟迟不给响应conn.connect();// 连接服务器int responseCode = conn.getResponseCode();// 获取响应码if (responseCode == 200) {InputStream inputStream = conn.getInputStream();String result = StreamUtils.readFromStream(inputStream);// System.out.println("网络返回:" + result);// 解析jsonJSONObject jo = new JSONObject(result);mVersionName = jo.getString("versionName");mVersionCode = jo.getInt("versionCode");mDesc = jo.getString("description");mDownloadUrl = jo.getString("downloadUrl");// System.out.println("版本描述:" + mDesc);if (mVersionCode > getVersionCode()) {// 判断是否有更新// 服务器的VersionCode大于本地的VersionCode// 说明有更新, 弹出升级对话框msg.what = CODE_UPDATE_DIALOG;} else {// 没有版本更新msg.what = CODE_ENTER_HOME;}}} catch (MalformedURLException e) {// url错误的异常msg.what = CODE_URL_ERROR;e.printStackTrace();} catch (IOException e) {// 网络错误异常msg.what = CODE_NET_ERROR;e.printStackTrace();} catch (JSONException e) {// json解析失败msg.what = CODE_JSON_ERROR;e.printStackTrace();} finally {long endTime = System.currentTimeMillis();long timeUsed = endTime - startTime;// 访问网络花费的时间if (timeUsed < 2000) {// 强制休眠一段时间,保证闪屏页展示2秒钟try {Thread.sleep(2000 - timeUsed);} catch (InterruptedException e) {e.printStackTrace();}}mHandler.sendMessage(msg);if (conn != null) {conn.disconnect();// 关闭网络连接}}}}.start();}/*** 升级对话框*/protected void showUpdateDailog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("最新版本:" + mVersionName);builder.setMessage(mDesc);// builder.setCancelable(false);//不让用户取消对话框, 用户体验太差,尽量不要用builder.setPositiveButton("立即更新", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("立即更新");download();}});builder.setNegativeButton("以后再说", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {enterHome();}});// 设置取消的监听, 用户点击返回键时会触发builder.setOnCancelListener(new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {enterHome();}});builder.show();}/*** 下载apk文件*/protected void download() {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {tvProgress.setVisibility(View.VISIBLE);// 显示进度String target = Environment.getExternalStorageDirectory()+ "/update.apk";// XUtilsHttpUtils utils = new HttpUtils();utils.download(mDownloadUrl, target, new RequestCallBack<File>() {// 下载文件的进度@Overridepublic void onLoading(long total, long current,boolean isUploading) {super.onLoading(total, current, isUploading);System.out.println("下载进度:" + current + "/" + total);tvProgress.setText("下载进度:" + current * 100 / total + "%");}// 下载成功@Overridepublic void onSuccess(ResponseInfo<File> arg0) {System.out.println("下载成功");// 跳转到系统下载页面Intent intent = new Intent(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(Uri.fromFile(arg0.result),"application/vnd.android.package-archive");// startActivity(intent);startActivityForResult(intent, 0);// 如果用户取消安装的话,// 会返回结果,回调方法onActivityResult}// 下载失败@Overridepublic void onFailure(HttpException arg0, String arg1) {Toast.makeText(SplashActivity.this, "下载失败!",Toast.LENGTH_SHORT).show();}});} else {Toast.makeText(SplashActivity.this, "没有找到sdcard!",Toast.LENGTH_SHORT).show();}}// 如果用户取消安装的话,回调此方法@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {enterHome();super.onActivityResult(requestCode, resultCode, data);}/*** 进入主页面*/private void enterHome() {Intent intent = new Intent(this, HomeActivity.class);startActivity(intent);finish();}}

主页面的布局 HomeActivity

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;import com.itheima52.mobilesafe.R;/*** 主页面* * @author Kevin* */
public class HomeActivity extends Activity {private GridView gvHome;private String[] mItems = new String[] { "手机防盗", "通讯卫士", "软件管理", "进程管理","流量统计", "手机杀毒", "缓存清理", "高级工具", "设置中心" };private int[] mPics = new int[] { R.drawable.home_safe,R.drawable.home_callmsgsafe, R.drawable.home_apps,R.drawable.home_taskmanager, R.drawable.home_netmanager,R.drawable.home_trojan, R.drawable.home_sysoptimize,R.drawable.home_tools, R.drawable.home_settings };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);gvHome = (GridView) findViewById(R.id.gv_home);gvHome.setAdapter(new HomeAdapter());}class HomeAdapter extends BaseAdapter {@Overridepublic int getCount() {return mItems.length;}@Overridepublic Object getItem(int position) {return mItems[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = View.inflate(HomeActivity.this,R.layout.home_list_item, null);ImageView ivItem = (ImageView) view.findViewById(R.id.iv_item);TextView tvItem = (TextView) view.findViewById(R.id.tv_item);tvItem.setText(mItems[position]);ivItem.setImageResource(mPics[position]);return view;}}
}

对获取服务器数据的

package com.itheima52.mobilesafe.utils;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** 读取流的工具* * @author Kevin* */
public class StreamUtils {/*** 将输入流读取成String后返回* * @param in* @return* @throws IOException*/public static String readFromStream(InputStream in) throws IOException {ByteArrayOutputStream out = new ByteArrayOutputStream();int len = 0;byte[] buffer = new byte[1024];while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}String result = out.toString();in.close();out.close();return result;}
}

xml 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/textView1"android:layout_width="match_parent"android:layout_height="50dp"android:background="#8866ff00"android:gravity="center"android:text="@string/tv_function"android:textColor="@color/black"android:textSize="22sp" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="5dp"android:layout_marginTop="5dp"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:singleLine="true"android:text="有了手机卫士, 腰不酸了,腿不疼了,走路也有劲了, 手机卫士太NB了"android:textColor="@color/black"android:textSize="18sp" /><GridViewandroid:id="@+id/gv_home"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:numColumns="3"android:verticalSpacing="20dp" ></GridView></LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/launcher_bg" ><TextViewandroid:id="@+id/tv_version"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:shadowColor="#f00"android:shadowDx="1"android:shadowDy="1"android:shadowRadius="1"android:text="版本号:1.0"android:textColor="#000"android:textSize="16sp" /><ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tv_version"android:layout_centerHorizontal="true" /><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_marginLeft="5dp"android:text="下载进度"android:visibility="gone"android:textColor="#f00"android:textSize="16sp" /></RelativeLayout>

manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.itheima52.mobilesafe"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="16" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.itheima52.mobilesafe.activity.SplashActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".activity.HomeActivity" /></application></manifest>

下载链接   http://download.csdn.net/detail/qq_26296197/9497330

android版本更新代码相关推荐

  1. android最新框架,XUpdate 一个轻量级、高可用性的Android版本更新框架

    XUpdate 一个轻量级.高可用性的Android版本更新框架.赶紧点击使用说明文档,体验一下吧! 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更 ...

  2. android开发关掉发现更新的官方版本,XUpdate:轻量级、高可用性的 Android 版本更新框架...

    一个轻量级.高可用性的Android版本更新框架 关于我 特点 支持post和get两种版本检查方式,支持自定义网络请求. 支持设置只在wifi下进行版本更新. 支持静默下载.自动版本更新. 提供界面 ...

  3. Android版本更新

    Android版本更新知识(检测.升级)总结 2017年03月14日 16:19:39 阅读数:13941 Android版本更新知识(检测.升级)总结 本文对Android版本更新的知识做全面的总结 ...

  4. Android 版本更新,支持增量更新

    AppSmartUpdate 项目地址:itlwy/AppSmartUpdate 简介: a smart lib for updating app / Android 版本更新,支持增量更新 更多:作 ...

  5. Android 版本更新安装apk

    Android 版本更新安装apk 版本更新是每个安卓应用都会涉及的,当有新的版本更新下载后,调用系统安装程序安装新的apk,targetSdkVersion 在7.0以下时我们直接使用以下代码: / ...

  6. Android 版本更新及akp安装

    android 版本更新 版本检测 更新 安装 话不多说直接上代码 图文流程 首先我们先看一下整体的逻辑思路 版本检测 从服务器获取版本信息 : 获取本地的版本信息: 本地与服务器的信息相比较: 更新 ...

  7. Android版本更新升级

    目前,应用市场上的应用程序基本上都有自动更新的功能,用于版本迭代,软件更新以达到更好的应用体验效果.本文我将简要介绍一下Android版本更新的相关知识. 一.知识预热 1.versionCode:版 ...

  8. android命令行工具 混淆,Android 混淆代码学习以及Android加密工具--APKProtect的使用ZZ...

    一:情景分析 有时候看到其他应用App的一些效果很炫,或者是功能实现很好就想着参考参考,于是乎,下载APK----反编译APK---查看源码....,但是悲剧来了....源码都是些a,b,c...等等 ...

  9. 黑客破译android开发代码真就那么容易?

    2019独角兽企业重金招聘Python工程师标准>>> 很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始 ...

最新文章

  1. 如何在bash中等待多个子进程完成并在任何子进程以代码!= 0结尾时返回退出代码!= 0?
  2. java连接redis无法连接,报异常RedisConnectionException
  3. GPU 2012年10月 性能排名
  4. java英语ppt_来了!思维导图一键转PPT来了!
  5. UML 中关系详解以及在visio中的表示
  6. [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
  7. Stream、FileStream、MemoryStream的区别
  8. Hyperledger Fabric教程(15)--基于Kafka的Order服务实战
  9. Linux期末考试模拟试题
  10. Unity组件脚本的常用类和结构体GameObject
  11. elixir 规格_六家使用Elixir的著名公司-以及为什么做出改变
  12. 计算机一级ppt加水印,2017年计算机一级WPS辅导:WPSOffice2007中插入水印和改变背景色...
  13. HDU - 5977 Garden of Eden (树形dp+容斥)
  14. java macd指标_Java 验证 MACD 底背离是否真的有效
  15. spring boot打包本地idea跑能行,上线jar包跑不行 解决
  16. The alias ‘TaskType‘ is already mapped to the value ‘com.xxx.entity.Tasktype‘.
  17. 解读 ESP32 API参考-system-App Image Format
  18. linux下github上传文件,linux下将本地文件上传到github中?
  19. 2019全国大学生电子设计大赛(回忆录)
  20. 【Linux】:shell循环语句

热门文章

  1. c语言学习-编程实现以下功能,读入两个数(d1,d2)和一个运算符(o),计算d1 o d2的值
  2. 虚拟现实设备排行榜(2016年3月27日)
  3. odoo10参考系列--命令行接口:odoo-bin
  4. 六年级计算机应用计划,六年级信息工作计划
  5. python123平台作业答案循环结构棋盘放米_python练习集100题(1-20)
  6. python永久保存数据_Python学习笔记(四)——文件永久存储
  7. mysql 建立索引_mysql建立索引的原则
  8. java 日历工具_java中强大的时间处理工具:Calendar类(日历类)
  9. git撤销单个文件的修改_大牛总结的 Git 使用技巧,写得太好了
  10. python编译器_11 个最佳的 Python 编译器和解释器