- 浏览: 624988 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
JAVA代码:
UpdateManager.java
[java] view plaincopy
- package com.iteye.update;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.HashMap;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.app.Dialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.content.Intent;
- import android.content.pm.PackageManager.NameNotFoundException;
- import android.net.Uri;
- import android.os.Environment;
- import android.os.Handler;
- import android.os.Message;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.ProgressBar;
- import android.widget.Toast;
- import com.iteye.androidtoast.R;
- public class UpdateManager
- {
- /* 下载中 */
- private static final int DOWNLOAD = 1;
- /* 下载结束 */
- private static final int DOWNLOAD_FINISH = 2;
- /* 保存解析的XML信息 */
- HashMap<String, String> mHashMap;
- /* 下载保存路径 */
- private String mSavePath;
- /* 记录进度条数量 */
- private int progress;
- /* 是否取消更新 */
- private boolean cancelUpdate = false;
- private Context mContext;
- /* 更新进度条 */
- private ProgressBar mProgress;
- private Dialog mDownloadDialog;
- private Handler mHandler = new Handler()
- {
- public void handleMessage(Message msg)
- {
- switch (msg.what)
- {
- // 正在下载
- case DOWNLOAD:
- // 设置进度条位置
- mProgress.setProgress(progress);
- break;
- case DOWNLOAD_FINISH:
- // 安装文件
- installApk();
- break;
- default:
- break;
- }
- };
- };
- public UpdateManager(Context context)
- {
- this.mContext = context;
- }
- /**
- * 检测软件更新
- */
- public void checkUpdate()
- {
- if (isUpdate())
- {
- // 显示提示对话框
- showNoticeDialog();
- } else
- {
- Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show();
- }
- }
- /**
- * 检查软件是否有更新版本
- *
- * @return
- */
- private boolean isUpdate()
- {
- // 获取当前软件版本
- int versionCode = getVersionCode(mContext);
- // 把version.xml放到网络上,然后获取文件信息
- //InputStream inStream = ParseXmlService.class.getClassLoader().getResourceAsStream("version.xml");
- // 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
- ParseXmlService service = new ParseXmlService();
- try
- {
- String path = "http://192.168.1.146:8080/picweb/xml/version.xml";
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setReadTimeout(5*1000);
- conn.setRequestMethod("GET");
- InputStream inStream = conn.getInputStream();
- mHashMap = service.parseXml(inStream);
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- if (null != mHashMap)
- {
- int serviceCode = Integer.valueOf(mHashMap.get("version"));
- // 版本判断
- if (serviceCode > versionCode)
- {
- return true;
- }
- }
- return false;
- }
- /**
- * 获取软件版本号
- *
- * @param context
- * @return
- */
- private int getVersionCode(Context context)
- {
- int versionCode = 0;
- try
- {
- // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
- versionCode = context.getPackageManager().getPackageInfo("com.iteye.androidtoast", 0).versionCode;
- } catch (NameNotFoundException e)
- {
- e.printStackTrace();
- }
- return versionCode;
- }
- /**
- * 显示软件更新对话框
- */
- private void showNoticeDialog()
- {
- // 构造对话框
- AlertDialog.Builder builder = new Builder(mContext);
- builder.setTitle(R.string.soft_update_title);
- builder.setMessage(R.string.soft_update_info);
- // 更新
- builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener()
- {
- @Override
- public void onClick(DialogInterface dialog, int which)
- {
- dialog.dismiss();
- // 显示下载对话框
- showDownloadDialog();
- }
- });
- // 稍后更新
- builder.setNegativeButton(R.string.soft_update_later, new OnClickListener()
- {
- @Override
- public void onClick(DialogInterface dialog, int which)
- {
- dialog.dismiss();
- }
- });
- Dialog noticeDialog = builder.create();
- noticeDialog.show();
- }
- /**
- * 显示软件下载对话框
- */
- private void showDownloadDialog()
- {
- // 构造软件下载对话框
- AlertDialog.Builder builder = new Builder(mContext);
- builder.setTitle(R.string.soft_updating);
- // 给下载对话框增加进度条
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- View v = inflater.inflate(R.layout.softupdate_progress, null);
- mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
- builder.setView(v);
- // 取消更新
- builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener()
- {
- @Override
- public void onClick(DialogInterface dialog, int which)
- {
- dialog.dismiss();
- // 设置取消状态
- cancelUpdate = true;
- }
- });
- mDownloadDialog = builder.create();
- mDownloadDialog.show();
- // 现在文件
- downloadApk();
- }
- /**
- * 下载apk文件
- */
- private void downloadApk()
- {
- // 启动新线程下载软件
- new downloadApkThread().start();
- }
- /**
- * 下载文件线程
- */
- private class downloadApkThread extends Thread
- {
- @Override
- public void run()
- {
- try
- {
- // 判断SD卡是否存在,并且是否具有读写权限
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
- {
- // 获得存储卡的路径
- String sdpath = Environment.getExternalStorageDirectory() + "/";
- mSavePath = sdpath + "download";
- URL url = new URL(mHashMap.get("url"));
- // 创建连接
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.connect();
- // 获取文件大小
- int length = conn.getContentLength();
- // 创建输入流
- InputStream is = conn.getInputStream();
- File file = new File(mSavePath);
- // 判断文件目录是否存在
- if (!file.exists())
- {
- file.mkdir();
- }
- File apkFile = new File(mSavePath, mHashMap.get("name"));
- FileOutputStream fos = new FileOutputStream(apkFile);
- int count = 0;
- // 缓存
- byte buf[] = new byte[1024];
- // 写入到文件中
- do
- {
- int numread = is.read(buf);
- count += numread;
- // 计算进度条位置
- progress = (int) (((float) count / length) * 100);
- // 更新进度
- mHandler.sendEmptyMessage(DOWNLOAD);
- if (numread <= 0)
- {
- // 下载完成
- mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
- break;
- }
- // 写入文件
- fos.write(buf, 0, numread);
- } while (!cancelUpdate);// 点击取消就停止下载.
- fos.close();
- is.close();
- }
- } catch (MalformedURLException e)
- {
- e.printStackTrace();
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- // 取消下载对话框显示
- mDownloadDialog.dismiss();
- }
- };
- /**
- * 安装APK文件
- */
- private void installApk()
- {
- File apkfile = new File(mSavePath, mHashMap.get("name"));
- if (!apkfile.exists())
- {
- return;
- }
- // 通过Intent安装APK文件
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
- mContext.startActivity(i);
- }
- }
ParseXmlService.java
[java] view plaincopy
- package com.iteye.update;
- import java.io.InputStream;
- import java.util.HashMap;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- public class ParseXmlService
- {
- public HashMap<String, String> parseXml(InputStream inStream) throws Exception
- {
- HashMap<String, String> hashMap = new HashMap<String, String>();
- // 实例化一个文档构建器工厂
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- // 通过文档构建器工厂获取一个文档构建器
- DocumentBuilder builder = factory.newDocumentBuilder();
- // 通过文档通过文档构建器构建一个文档实例
- Document document = builder.parse(inStream);
- //获取XML文件根节点
- Element root = document.getDocumentElement();
- //获得所有子节点
- NodeList childNodes = root.getChildNodes();
- for (int j = 0; j < childNodes.getLength(); j++)
- {
- //遍历子节点
- Node childNode = (Node) childNodes.item(j);
- if (childNode.getNodeType() == Node.ELEMENT_NODE)
- {
- Element childElement = (Element) childNode;
- //版本号
- if ("version".equals(childElement.getNodeName()))
- {
- hashMap.put("version",childElement.getFirstChild().getNodeValue());
- }
- //软件名称
- else if (("name".equals(childElement.getNodeName())))
- {
- hashMap.put("name",childElement.getFirstChild().getNodeValue());
- }
- //下载地址
- else if (("url".equals(childElement.getNodeName())))
- {
- hashMap.put("url",childElement.getFirstChild().getNodeValue());
- }
- }
- }
- return hashMap;
- }
- }
version.xml
[html] view plaincopy
- <?xml version="1.0" encoding="UTF-8"?>
- <update>
- <version>1</version>
- <name>baidu_xinwen_1.1.0</name>
- <url>http://gdown.baidu.com/data/wisegame/f98d235e39e29031/baiduxinwen.apk</url>
- </update>
测试代码:
[html] view plaincopy
- UpdateManager manager = new UpdateManager(MainTwoActivity.this);
- // 检查软件更新
- manager.checkUpdate();
注:只需要把version.xml放到网上服务器去,更新版本时,到服务器把版本号和url修改一下就可以。
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1409当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 21531.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1581刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 988从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2436android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1509F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1125添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1121declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5217如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1036从 Java 5 开始,Java 提供了自己的线程池。线 ... -
adb命令详解
2012-09-19 15:04 2787Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1611public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1603使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10034PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 860这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9281.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1073在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1011public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1903首先呢,我们还是看几个示图:(这是360推出的一款天气预 ... -
android中如何更有效率得解析xml
2012-09-05 17:17 1277好久没写过博文了,最近在做xml方面的解析,x ...
相关推荐
Android 用Service+OKHttp实现应用后台检测更新示例代码; Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台...
3.1 Android应用程序的组成部分 43 3.2 程序清单简介 44 3.3 使用清单编辑器 47 3.4 Android应用程序生命周期 48 3.5 理解应用程序的优先级和进程状态 49 3.6 分离资源 50 3.6.1 创建资源 50 3.6.2 使用资源...
恶意软件的检测又可分为恶意行为的检测和恶意代码的检测,提出按SVM算法应用到的检测领域分类,分别对其应用于Android应用程序中的恶意行为检测、恶意代码检测和漏洞检测等方面的研究进行分析与讨论,总结了当前该...
Android实例源码-应用启动应用退出&网络判断类安卓源代码(12例) 3G和wifi的切换监听 android 在线更新示例代码 android程序的自动更新 和 基于GPS定位的轨迹存储 app更新,实现service下载 ViewPager+Fragment侧滑...
代码向量深度学习的恶意Android应用检测方法.pdf
android启动页引导页到主界面含有检查应用更新。.rar
发挥Android应用的多类行为特征在恶意代码检测上所起的不同作用.文中首次提出了一种综合考虑Android多 类行为特征的三层混合系综算法THEA(Triple Hybrid Ensemble Algorithm)用于检测Android未知恶意应用.首 先,...
Android应用自动更新库(android-auto-update) 该library项目实现了软件版本检查,apk文件下载,软件安装(Android app update checker,download and install apk)支持API 8 1.导入library项目 提供2种版本检查方式...
用于android程序自动检测更新,里面包含检测是否有更新,有更新可以选择更新
《21世纪高等学校计算机基础实用规划教材:Android应用程序设计》是面向Android系统的初学者的入门教程,内容几乎涵盖了Android相关的所有技术。本书大致可以分成两个部分,第一部分(第1~4章)主要介绍Android SDK...
无法迅速检测出新型恶意Android应用及其变种,为了降低现有静态检测的漏报率,提高对新型恶意应用的检测速度,提出一种通过深度网络融合模型实现的恶意Android应用检测方法。首先提取反编译得到的Android应用核心...
基于源代码静态分析技术的Android应用恶意行为检测模型,路程,张淼,目前,基于Linux内核的Android移动终端操作系统面临着大量恶意软件的安全威胁。本文提出一种基于静态分析技术的Android应用恶意行为检��
代码克隆检测技术的Android应用重打包检测.pdf
从网上发现的一个Android硬件检测软件相关源代码,同时包括文件管理和应用管理,检测包括1、检测系统信息,查看设备系统版本,运营商及其系统信息. 2、硬件信息查看包括CPU,硬盘,内存等硬件信息,文件管理可管理手机...
Android身体检测,调用命令,视频播放代码,健身助手全部Android代码。检测人体是否运动
Flutter应用程序源代码为iOS和Android应用程序 REST API的后端源代码 管理面板源代码 特征 动画闪屏 登录/注册 社交登录 电话登录 更改密码/忘记密码 密码强度检查器 新帐户的OTP验证 Faceid/touch id 更新简档...
亲测可用。当打开软件时,手机的闪光灯也会自动打开,将手指放在摄像头上时,可以将用户的心跳条形图和心率数值显示出来。
一个记录血压测量的android应用程序。
一种基于Dalvik指令抽象的Android恶意代码检测方法一种基于Dalvik指令抽象的Android恶意代码检测方法
适用于 Android 设备的硬件和软件信息检测应用