- 浏览: 159765 次
- 性别:
- 来自: 上海 苏州
最新评论
-
di1984HIT:
血的不错啊,
用HTTP GET调用web service(Java、Groovy两个版本) -
zxw13651485:
学习了!!!
使用基站、wifi实现定位 -
yanruxu801314:
不错,楼主确实有才,可我很奇怪的是,这个app现在还有更新么, ...
豆瓣同城的客户端---豆邻1.0 -
chen052210123:
每次都睡5秒,是不是不太好啊
在线升级Android应用程序完善版 -
zmwell:
楼主啊,我用你上面的程序进行定位,我在西安,却定位到了北京,这 ...
使用基站、wifi实现定位
转载请注明出处
发一个完善版本的 思路还是原来的思路,上一篇文章:http://fengzhizi715.iteye.com/blog/792774
不过结合了线程和ProgressBar
代码如下:
效果图如下:
PKG是包名
CLS是主的activity的名称
activity的名称只是Activity的名字吗?不用加包名?
是com.test.Activity名称还是直接名称?
要加包名的
PKG是包名
CLS是主的activity的名称
activity的名称只是Activity的名字吗?不用加包名?
是com.test.Activity名称还是直接名称?
PKG是包名
CLS是主的activity的名称
发一个完善版本的 思路还是原来的思路,上一篇文章:http://fengzhizi715.iteye.com/blog/792774
不过结合了线程和ProgressBar
代码如下:
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) { } } }
效果图如下:
评论
9 楼
chen052210123
2012-08-14
每次都睡5秒,是不是不太好啊
8 楼
caishijin
2011-08-26
这个是app启动后检查是否有新版本的吧
有没有办法想 PC 360一样,app 没有启动的时候,也能检查到是否有新版本下载呀?
有没有办法想 PC 360一样,app 没有启动的时候,也能检查到是否有新版本下载呀?
7 楼
melodytime
2011-07-31
楼主DOWNLOAD和DOWNLOAD_AGAIN;INSTALL和INSTALL_AGAIN,分别代表什么呢?
6 楼
glaivelee-michele
2011-07-28
com.decarta.db.MapVersionTable 是哪里的呀? 自定义的吗? 貌似没有代码啊?
5 楼
fengzhizi715
2011-05-25
liudi 写道
fengzhizi715 写道
liudi 写道
325 行 i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
PKG是包名
CLS是主的activity的名称
activity的名称只是Activity的名字吗?不用加包名?
是com.test.Activity名称还是直接名称?
要加包名的
4 楼
liudi
2011-05-25
fengzhizi715 写道
liudi 写道
325 行 i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
PKG是包名
CLS是主的activity的名称
activity的名称只是Activity的名字吗?不用加包名?
是com.test.Activity名称还是直接名称?
3 楼
fengzhizi715
2011-05-25
liudi 写道
325 行 i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
PKG是包名
CLS是主的activity的名称
2 楼
liudi
2011-05-25
325 行 i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
这个具体神马意思 AppConfig.PKG, AppConfig.CL这两个是什么求解
1 楼
wx0021
2011-03-01
知己啊!顶一个,俺去年也这样想过并在公司提出想法后,没有一个人赞成我的。终于在这找到志同道合的了。
发表评论
-
豆瓣同城的客户端---豆邻1.0
2011-04-01 15:23 2059豆邻是豆瓣同城的android客户端。具有豆瓣同城的功 ... -
【原创】实现类似街旁网的分享足迹功能
2011-03-06 16:19 3119转载请注明出处 在sina微博上看到街旁网的客户端有 ... -
【原创】时客地图1.7
2011-03-03 00:23 1735时客地图是一款android上的app,目前的最新版本是1.7 ... -
【原创】时客地图1.6
2011-02-12 12:07 1192时客地图是一款android上的app,目前的最新版本是1.6 ... -
【原创】时客地图1.5
2011-01-28 13:18 1191时客地图是一款android上的app,目前的最新版本是1.5 ... -
使用基站、wifi实现定位
2010-11-26 17:28 16911转载请注明出处 android可以借助于gps ... -
关于自适应屏幕方向和大小的一些经验
2010-11-10 13:57 4979转载请注明出处 刚开始,我开发时选取的模拟 ... -
Android隐性Intent的例子
2010-11-02 17:38 7887转载请注明出处 Android的Intent分为两大 ... -
Android 线程超时的例子
2010-11-02 15:09 9263转载请注明出处 android的线程和java的线程是 ... -
在线升级Android应用程序的思路
2010-10-24 23:53 3953转载请注明出处 如果某个app有内嵌的s ... -
通过地名获得经纬度并标识在地图上
2010-10-19 17:30 6025转载请注明出处 主要是调用Geocoder的getFromL ... -
分享一款android的日历组件
2010-10-17 15:28 3834转载请注明出处 这个日历组 ... -
多个Activity跳转的小结
2010-10-17 15:03 21644转载请注明出处 在android开发中Activity相当于 ... -
时客1.4
2010-07-03 12:58 1163增加公交线路的详细信息: 1)公交线路的查询 2)公交站点途径 ... -
时客1.3
2010-06-15 22:36 955在1.2版本中增加了地铁的查询功能,在1.3版本中新增了查询打 ... -
刚做的2款应用
2010-06-08 00:05 1141由于刚升级了android的固件到2.1,因此我也将我 ... -
比价器0.1版本
2010-06-01 23:23 1340做了一个比较当当 卓越 china-pub 图书的价格 ... -
时客1.0beta发布
2010-02-28 15:06 984时客,可以查询火车班次、飞机航班 我在G2上 ... -
做了一个可以查询飞机航班、火车班次的小应用
2010-02-14 15:01 3499做得很粗糙,代码量也很少,数据通过调用web service得 ...
相关推荐
Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用...随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用...随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用...随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用...随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
自2005年正式发布以来,瑞友天翼应用虚拟化系统始终坚持以以用户的需求为导向,不断完善产品的性能,目前已经发布了数十个版本,而瑞友公司在不断提升产品的同时,以最新的企业级虚拟化技术、更丰富更优秀的企业信息...
Activity Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,是一个负责与用户交互的组件 SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。...
完善了Linux 系统,升级包括: - 增加 支持USB 3G 上网卡,支持上百种3G上网卡,如目前应用最多的华为E261等 - 增加支持USB 摄像头,首选罗技720p高清摄像头C270,其他UVC摄像头可自行测试。 - 增加经过UI优化的 ...
从简单到深入为Android应用程序测试. iTestin3.0.1实用功能概括: 控件识别与坐标录制脚本 支持脚本本地编辑功能 支持滑屏,长按等操作 支持账号及复杂文本的输入 支持断言、休眠、截屏等脚本操作 支持插入、删除、...
从简单到深入为Android应用程序测试. iTestin3.0.1实用功能概括: 控件识别与坐标录制脚本 支持脚本本地编辑功能 支持滑屏,长按等操作 支持账号及复杂文本的输入 支持断言、休眠、截屏等脚本操作 支持插入、删除、...
木蚂蚁电子市场是基于android平台的客户端软件,提供安卓应用程序的分享与下载。 木蚂蚁电子市场以内容全,下载快,汉化内容多为特色,在界面上和功能操作方面,充分考虑国人使用习惯。免费提供海量国内外各类热门...
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用...随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
更加完善的开发指南主题定制:支持颜色主题和深色模式,页面更加美观国际化/多语言:应用内容和pages.json国际化,支持N种语言♡iconfont:海量字体图标支持♡rap2接口管理平台:支持在线模拟数据模拟接口请求:不同...
而随着 HTML5 的不断发展和完善,它在游戏开发领域也越来越受到重 视。...HTML5 游戏采用的是 Web 标准技术,与 Web 应用程序开发类似。因此,它 具有更好的可维护性,随着 Web 技术的不断发展和升级, HTML
摘要:产业技术创新加速,商业模式变革方兴未艾,新兴应用层出不穷,将推动产业融合发展和转型升级,能根据需求开发应用程序,完成模块设计、编码、测试、维护、文档编写工作;,编制测试计划、测试方案、测试用例、...
4、熟悉Android应用开发框架、SDK及常用调测方法; 5、熟悉Android UI界面常用组件、常用布局方法、事件处理机制; 6、熟悉Android多线程设计、网络编程、数据存储与IO、多媒体开发; 7、熟悉Android端WebSocket...
4、熟悉Android应用开发框架、SDK及常用调测方法; 5、熟悉Android UI界面常用组件、常用布局方法、事件处理机制; 6、熟悉Android多线程设计、网络编程、数据存储与IO、多媒体开发; 7、熟悉Android端WebSocket...
4、熟悉Android应用开发框架、SDK及常用调测方法; 5、熟悉Android UI界面常用组件、常用布局方法、事件处理机制; 6、熟悉Android多线程设计、网络编程、数据存储与IO、多媒体开发; 7、熟悉Android端WebSocket...
4、熟悉Android应用开发框架、SDK及常用调测方法; 5、熟悉Android UI界面常用组件、常用布局方法、事件处理机制; 6、熟悉Android多线程设计、网络编程、数据存储与IO、多媒体开发; 7、熟悉Android端WebSocket...
跨端抹平度更完善,且各端特色发挥更灵活,可真正实现一套代码多端覆盖,无需各端多头维护升级 官方认可:阿里小程序官方工具内置uni-app(),腾讯课堂官方自制uni-app培训视频() 扫码体验 开发一次,编译到10个...