- 浏览: 637305 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1469当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 22011.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1637刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1035从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2485android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1560F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1167添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1179declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5312如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1080从 Java 5 开始,Java 提供了自己的线程池。线 ... -
adb命令详解
2012-09-19 15:04 2892Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1654public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1648使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10086PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 906这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9691.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1123在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1054public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1941首先呢,我们还是看几个示图:(这是360推出的一款天气预 ... -
android中如何更有效率得解析xml
2012-09-05 17:17 1328好久没写过博文了,最近在做xml方面的解析,x ...
相关推荐
本文将详细探讨如何在Android应用程序中实现自动检查并下载新版本的代码逻辑,以达到无缝更新的效果。 首先,我们需要一个服务(Service)来执行后台的更新检查。这个服务会在合适的时机(例如应用启动时或网络连接...
在Android应用开发中,"在线更新"是一个常见的功能,它允许用户通过网络检查并下载应用的新版本,以保持软件的最新状态。这个压缩包“Android应用源码之android 在线更新示例代码.zip”提供了实现这一功能的具体示例...
Android 用Service+OKHttp实现应用后台检测更新示例代码; Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台...
在Android应用开发领域,源代码是开发者学习和提升技能的重要资源。这个压缩包包含了7个经典的Android应用程序源代码,它们代表了不同的功能实现和技术应用,对于Android开发者来说,具有极高的学习和参考价值。下面...
综上所述,实现Android应用更新检查涉及到网络通信、数据解析、用户交互等多个环节,需要综合运用多种Android开发技术和最佳实践。开发者应确保整个过程的效率、安全性和用户体验,同时考虑到各种可能的场景和错误...
通过研究这些内容,你可以深入了解Android应用程序自动更新的完整流程,并将其应用于自己的项目中,为用户提供更便捷的更新体验。同时,这也有助于提升你在Android网络编程、多线程处理和用户交互设计等方面的能力。
在Android应用开发中,"在线更新"功能是一个重要的组成部分,它允许用户在应用程序内部检查并下载最新的版本,确保软件始终保持最新状态。这份"Android应用源码之android 在线更新示例代码"是一个实用的示例,非常...
在Android应用开发中,应用内更新是至关重要的一个环节,它能够让用户无缝地获取到应用的最新功能和修复,提高用户体验。"Android-android应用应用内更新解决方案"主要探讨的就是如何在Android应用程序中实现平滑、...
总的来说,Android应用自动更新是一个涉及多方面技术的过程,包括服务器端的版本管理、客户端的检查更新机制、用户界面设计以及安全性考虑。开发者需要根据自己的需求和用户习惯来定制更新策略。
在Android应用开发中,自动更新功能是至关重要的,它能够帮助开发者及时修复程序中的错误,增加新特性,并确保用户始终使用的是最新版本的应用。"Android 应用软件自动更新源码"是一个示例项目,旨在教授如何在...
在Android应用开发中,版本更新是一项重要的功能,它允许用户获取应用的最新版本,修复问题,增加新特性,保持软件的稳定性和安全性。本篇将深入解析如何在Android项目中实现版本更新的源代码。 首先,我们需要理解...
"AndroidAppUpdater"是一个专为Android应用程序设计的开源更新库,尤其适用于伊朗的应用市场。这个库旨在帮助开发者轻松地在新版本发布时通知用户进行更新,从而提高用户体验,保持应用的安全性和功能完整性。 一、...
本文将详细介绍如何在Android应用中实现自动检测更新以及下载安装新版本的功能,并通过具体的源代码示例来帮助读者理解这一过程。 #### 二、自动更新的基本原理 自动更新主要包括以下几个步骤: 1. **检查更新**...
综上所述,代码向量深度学习的恶意Android应用检测方法是一种高效的检测手段,通过深度网络模型能够提升对新型恶意应用的检测速度和准确度。未来,随着深度学习技术的不断进步及其在安全领域的深入应用,我们可以...
代码克隆检测技术在 Android 应用重打包检测中的应用 代码克隆检测技术是计算机科学中的一种技术,旨在检测和识别软件代码中的克隆现象。克隆是指在不同地方出现的相似代码,可能是由于开发者之间的信息共享、代码...
本压缩包文件"Android应用源码之代码调用C++代码和C++代码调用Java代码"提供了关于如何在Android应用中集成C++代码的示例,适用于那些想要深入了解跨语言编程的开发者。 1. **JNI(Java Native Interface)** JNI...
在Android应用开发中,实现应用自动检测更新、下载并安装的功能是提高用户体验和保持软件最新状态的关键。"updatedemo"通常是指一个示例项目,它展示了如何构建这样的更新机制。以下将详细介绍这个过程中的关键知识...
5. **安全机制**:Android的安全模型基于权限管理,源代码揭示了权限是如何被授予和检查的,有助于开发者编写更安全的应用。 学习Android自带应用程序源代码的过程通常涉及阅读代码、追踪函数调用、理解类结构和...