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.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
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.ProgressBar;
import android.widget.Toast;
import com.decarta.db.MapVersionTable;
/**
* @author Tony Shen
*
*/
public class Main extends Activity {
private MapVersionTable mDB;
private String mapVersion;
private String apkUrl;
private List<RunningAppProcessInfo> process;
private ActivityManager activityMan;
private ProgressBar progressBar;
private final int CHECK_NEW_VERSION = 1;
private final int DOWNLOAD = 2;
private final int INSTALL = 3;
private final int CHECK_APP = 4;
private final int INVOKE_APP = 5;
private final int DOWNLOAD_AGAIN = 6;
private final int INSTALL_AGAIN = 7;
private boolean newVersionFlag = false;
private boolean checkAppFlag = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mDB = new MapVersionTable(this);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setIndeterminate(false);
progressBar.setVisibility(View.VISIBLE);
progressBar.setMax(100);
progressBar.setProgress(0);
checkAppFlag = checkApp();
new Thread(new Runnable() {
Message msg = new Message();
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.what = CHECK_NEW_VERSION;
mHandler.sendMessage(msg);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (newVersionFlag) {
msg.what = DOWNLOAD;
mHandler.sendMessage(msg);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.what = INSTALL;
mHandler.sendMessage(msg);
} else {
msg.what = CHECK_APP;
mHandler.sendMessage(msg);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (checkAppFlag) {
msg.what = INVOKE_APP;
mHandler.sendMessage(msg);
} else {
msg.what = DOWNLOAD_AGAIN;
mHandler.sendMessage(msg);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.what = INSTALL_AGAIN;
mHandler.sendMessage(msg);
}
}
}
}).start();
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what){
case CHECK_NEW_VERSION:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "检查更新", Toast.LENGTH_SHORT).show();
newVersionFlag = checkNewVersion();
progressBar.setProgress(30);
}
break;
case DOWNLOAD:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "下载更新", Toast.LENGTH_SHORT).show();
downloadAPK(apkUrl);
progressBar.setProgress(60);
}
break;
case INSTALL:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "安装更新", Toast.LENGTH_SHORT).show();
killProcess();
progressBar.setProgress(100);
installAPK();
finish();
}
break;
case CHECK_APP:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "检查应用", Toast.LENGTH_SHORT).show();
// checkAppFlag = checkApp();
progressBar.setProgress(60);
}
break;
case INVOKE_APP:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "程序启动", Toast.LENGTH_SHORT).show();
progressBar.setProgress(100);
invokeAPK();
finish();
}
break;
case DOWNLOAD_AGAIN:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "下载更新", Toast.LENGTH_SHORT).show();
progressBar.setProgress(80);
downloadAPK(apkUrl);
}
break;
case INSTALL_AGAIN:
if(!Thread.currentThread().isInterrupted()){//当前线程正在运行
Toast.makeText(Main.this, "安装更新", Toast.LENGTH_SHORT).show();
progressBar.setProgress(100);
installAPK();
finish();
}
break;
default:
progressBar.setVisibility(View.GONE);
Thread.currentThread().interrupt();//中断当前线程.
break;
}
super.handleMessage(msg);
}
};
private boolean checkNewVersion() {
try {
URL url=new URL(AppConfig.SERVLET_URL);
SAXParserFactory factory=SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
SAXParser parser=factory.newSAXParser();
InputStream is = url.openStream();
parser.parse(is, new DefaultHandler(){
private String cur="";
private int step;
@Override
public void startDocument() throws SAXException {
step = 0;
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
cur = localName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch, start, length).trim();
if (str == null || str.equals(""))
return;
if (cur.equals("url")) {
apkUrl = str;
}
if (cur.equals("map_version")) {
mapVersion = str;
}
}
@Override
public void endElement(String uri, String localName,
String qName) throws SAXException {
step = step + 1;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (diffVersion(mapVersion))
return true;
else
return false;
}
private boolean diffVersion(String mapVersion) {
String lastVersion = mDB.getLastMapVersion();
if (lastVersion == null) {
mDB.setMapVersion(mapVersion);
return true;
}
if (!lastVersion.equals(mapVersion)) {
mDB.setMapVersion(mapVersion);
return true;
}
else
return false;
}
private void downloadAPK(String apkUrl) {
String filePath = "//sdcard//download//" + AppConfig.APKNAME;
URL url = null;
try {
url = new URL(apkUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
InputStream in = con.getInputStream();
File fileOut = new File(filePath);
FileOutputStream out = new FileOutputStream(fileOut);
byte[] bytes = new byte[1024];
int c;
while ((c = in.read(bytes)) != -1) {
out.write(bytes, 0, c);
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void killProcess() {
activityMan = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
process = activityMan.getRunningAppProcesses();
int len = process.size();
for(int i = 0;i<len;i++) {
if (process.get(i).processName.equals(AppConfig.PKG)) {
android.os.Process.killProcess(process.get(i).pid);
}
}
}
private void installAPK() {
String fileName = getSDPath() +"/download/"+AppConfig.APKNAME;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);
}
private void invokeAPK() {
Intent i=new Intent();
i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));
startActivity(i);
}
private boolean checkApp() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings",
"com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName",
AppConfig.APKNAME);
List<ResolveInfo> acts = getPackageManager().queryIntentActivities(
intent, 0);
if (acts.size() > 0)
return true;
else
return false;
}
private String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED); // determine whether sd card is exist
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// get the root directory
}
return sdDir.toString();
}
@Override
public void finish() {
super.finish();
Thread.currentThread().interrupt();//中断当前线程.
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
mDB.close(); // be sure to close
} catch (Exception e) {
}
}
}
分享到:
相关推荐
2.升级分为两个部分,分别是系统程序升级和内部资料升级; 3.如果用户只需要系统程序升级,可以不进行资料升级;如果进行了资料升级,就必须要执行系统程序升级; 二、安装说明(建议用户使用WINDOWS XP操作系统;...
程序升级包是为了优化和增强点读笔的功能,确保其性能稳定、内容更新及时而推出的。下面将详细阐述点读笔的原理、升级过程以及可能涉及的技术点。 1. 点读笔工作原理: 点读笔的核心是光学识别技术,包括红外线...
应用程序升级通常涉及以下几个关键步骤和知识点: 1. **编程接口**:dsPIC33F系列单片机通常通过串行外设接口(SPI)、并行接口或In-Circuit Debugger(ICD)进行编程。理解这些接口的工作原理和连接方式是进行程序...
"winform程序升级功能"涉及到的是如何在已部署的WinForm应用中实现自动更新和手动更新的功能。 一、自动升级 自动升级是让用户在不离开应用程序的情况下,系统自动检测并下载最新的程序版本进行更新。这一过程通常...
程序升级是软件维护和发展的重要环节,它涉及到将旧版本的程序替换为新版本,以引入新的功能、修复已知问题或提升性能。本Demo演示了一种通过FTP服务器进行程序升级的方法,具体步骤包括下载升级包、解压、覆盖旧...
这个“海康DS-7804H-SNH系列真正支持萤石云程序升级包+升级工具”是一个专门针对该系列NVR的软件更新包,旨在提升设备的功能性和稳定性,同时提供了升级过程所需的工具。 首先,我们需要了解萤石云服务。萤石云是...
本压缩包文件"专用海康威视录像机,型号:DS_7808H_SNH 主控v3.0程序升级包.zip"是针对DS-7808H-SNH录像机的主控程序升级工具,主要目的是将主控软件更新到V3.0.1版本,build号为140524。这个版本的更新可能包括了...
数控系统集成PLC程序升级建设,通常指的是在数控机床或生产线上,将原有的可编程逻辑控制器(PLC)程序升级到更现代、更高效的版本,以提升设备的性能和功能。文中所涉及的德国进口机加工流水线,其数控加工工位使用...
在C# Winform应用程序开发中,程序升级是一个重要的功能,特别是在持续迭代和更新软件时。本文将详细讨论如何设计一个Winform程序升级机制,通过数据库存储来管理版本信息。 首先,我们要理解升级程序的基本原理。...
在这个场景中,我们关注的是如何利用FTP来实现远程程序升级。FTP方式的远程程序升级是软件维护和更新的重要手段,它允许管理员或用户无须直接访问服务器,即可下载并安装新的软件版本。 首先,我们要了解FTP的基本...
在开发和维护过程中,程序升级是一个常见的需求,传统的做法是通过仿真器进行程序烧写,但这种方法存在操作繁琐,且存在损坏设备的风险。为了解决这一问题,文章介绍了一种通过串口直接升级单片机程序的方法。这种...
"sjcx.rar_VB 升级_VB 程序升级_vb升级_升级程序_网络 vb"这个压缩包文件,显然是一个关于VB应用程序网络升级的解决方案。下面我们将详细探讨VB程序升级的相关知识点。 首先,VB程序升级的目的是为了修复程序中的...
linux下的一个程序升级工具,也就是一个文件传输工具,采用TCP协议实现,客户端发送升级请求,服务器端发送升级程序到客户端。服务器采用多线程支持多个客户端同时升级,可以是同一个文件,也可以使不同文件,而且有...
程序自动升级原理 原理分析: 一般都是主程序配合升级程序完成升级工作的。主程序定时检查更新或者由用户自己点击更新。大致步骤如下: 1.主程序释放更新程序。 2.更新程序下载官方版本信息文件。 3.与本地版本...
STM32F103终端设备远程程序升级设计报告 2014-4-17 1。把STM32F103的FLASH 分成2部分,0x08000000~0x08003fff,是IAP程序; 00x08004000~ ,是APP程序; 2。硬件机构:内有GSM模块(移远M35),作为远程通信用。 在...
5、 Autoup /Application/ApplicationId为程序升级时在客户端建军立的保存临时下载文件的目录名 6、 Autoup /Application /EntryPoint为主程序的运行文件,即您的程序的启动文件 7、 Autoup /Application/ Version为...
将STM32内部Flash虚拟成U盘,通过复制bin文件实现程序升级。 1.内部Flash分配:IAP[12K]+文件分配表(虚拟的)+程序[244K],没有浪费 2.原理是FAT文件系统没有其他文件时,数据存放是连续的(数据区)
### 应用程序升级流程详解 #### 一、引言 在现代软件开发中,确保应用程序能够自动检测更新并平滑地完成升级过程是至关重要的。本文将详细解析一个典型的应用程序升级流程,并通过给定的文件信息进行深入分析。 #...
STM32 IAP(In-Application Programming)程序升级源码是一种在应用中更新固件的技术,允许用户在不拔掉芯片或使用专用编程设备的情况下,通过串口、USB等方式远程更新MCU中的程序。这种技术在物联网设备、嵌入式...