- 浏览: 161625 次
- 性别:
- 来自: 上海 苏州
最新评论
-
di1984HIT:
血的不错啊,
用HTTP GET调用web service(Java、Groovy两个版本) -
zxw13651485:
学习了!!!
使用基站、wifi实现定位 -
yanruxu801314:
不错,楼主确实有才,可我很奇怪的是,这个app现在还有更新么, ...
豆瓣同城的客户端---豆邻1.0 -
chen052210123:
每次都睡5秒,是不是不太好啊
在线升级Android应用程序完善版 -
zmwell:
楼主啊,我用你上面的程序进行定位,我在西安,却定位到了北京,这 ...
使用基站、wifi实现定位
转载请注明出处
如果某个app有内嵌的sqlite数据库,则可以在应用程序app前增加一个专门用于升级的应用update app。在升级时先使用update app,如果有新版本的话可以去服务端下载最新的app,如果没有新版本的话则直接调用本地的app。
Update app的大致思路是这样的:
其中MapVersionTable是用于update app记录应用程序版本的。
checkNewVersion()用于检查是否有新版本的存在,并将服务端的版本号存入mapVersion变量,将服务端的应用地址存放在apkUrl变量。这段检查应用程序的方法,其实是利用rest方式进行访问,当然也可以用web service或者其他通讯方式。
diffVersion()是将服务端版本号和本地版本号进行比较,如果存在新版本,则将最新的版本号存入数据库并调用downloadAPK();如果不存在新版本,则会调用本地的app。不过在调用本地app前需要先判断本地的app是否安装,这个时候使用checkApp()方法。
checkApp()该方法用于检查本地是否安装该app
killProcess()是杀掉进程,防止升级时该应用还在使用。
installAPK()将下载的app进行安装
invokeAPK()根据包名,调用本地的应用。
最后,不要忘记关闭数据库 呵呵
貌似现在还不能模块化升级
看来如果想这么做只有找变通的方法了
好的 我还没有研究过豌豆荚,呵呵
不过我的升级程序只能升级自己的app,相当于在app前再挂一个升级用的app
貌似现在还不能模块化升级
不会 我测试过了 呵呵
如果某个app有内嵌的sqlite数据库,则可以在应用程序app前增加一个专门用于升级的应用update app。在升级时先使用update app,如果有新版本的话可以去服务端下载最新的app,如果没有新版本的话则直接调用本地的app。
Update app的大致思路是这样的:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mDB = new MapVersionTable(this); if (checkNewVersion()) { if (apkUrl == null) return; downloadAPK(apkUrl); killProcess(); installAPK(); finish(); } else { if (checkApp()) { invokeAPK(); finish(); }else { downloadAPK(apkUrl); installAPK(); finish(); } } }
其中MapVersionTable是用于update app记录应用程序版本的。
checkNewVersion()用于检查是否有新版本的存在,并将服务端的版本号存入mapVersion变量,将服务端的应用地址存放在apkUrl变量。这段检查应用程序的方法,其实是利用rest方式进行访问,当然也可以用web service或者其他通讯方式。
private boolean checkNewVersion() { try { URL url=new URL(AppConfig.REST_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; }
diffVersion()是将服务端版本号和本地版本号进行比较,如果存在新版本,则将最新的版本号存入数据库并调用downloadAPK();如果不存在新版本,则会调用本地的app。不过在调用本地app前需要先判断本地的app是否安装,这个时候使用checkApp()方法。
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; }
checkApp()该方法用于检查本地是否安装该app
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; }
killProcess()是杀掉进程,防止升级时该应用还在使用。
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); } } }
installAPK()将下载的app进行安装
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); }
invokeAPK()根据包名,调用本地的应用。
private void invokeAPK() { Intent i=new Intent(); i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS)); startActivity(i); }
最后,不要忘记关闭数据库 呵呵
protected void onDestroy() { super.onDestroy(); try { mDB.close(); // be sure to close } catch (Exception e) { } }
评论
13 楼
zhouy478319399
2011-09-10
能发个源码吗,老大。zhouyou478319399@163.com
12 楼
glaivelee-michele
2011-07-28
楼主 :
com.decarta.db.MapVersionTable 是哪里的呀? 自定义的吗? 貌似没有代码啊?
com.decarta.db.MapVersionTable 是哪里的呀? 自定义的吗? 貌似没有代码啊?
11 楼
lovext
2010-11-01
不错,思路清晰。
10 楼
cnflood
2010-11-01
不错不错,目前正需要这么个功能,先学习了
9 楼
fengzhizi715
2010-10-29
程序改进了一下
http://fengzhizi715.iteye.com/blog/797782
http://fengzhizi715.iteye.com/blog/797782
8 楼
nj_first
2010-10-28
fengzhizi715 写道
nj_first 写道
不知道Android能不能做到这样开发,以模块的方式开发应用。我的设想是应用分成若干模块,这样可仅对其中需要升级的模块升级。
貌似现在还不能模块化升级
看来如果想这么做只有找变通的方法了
7 楼
fengzhizi715
2010-10-27
Ihavegotyou 写道
比较统一的方法可以看看豌豆荚, 他是比较 AndroidManifest.xml的 android:versionCode
好的 我还没有研究过豌豆荚,呵呵
不过我的升级程序只能升级自己的app,相当于在app前再挂一个升级用的app
6 楼
fengzhizi715
2010-10-27
nj_first 写道
不知道Android能不能做到这样开发,以模块的方式开发应用。我的设想是应用分成若干模块,这样可仅对其中需要升级的模块升级。
貌似现在还不能模块化升级
5 楼
fengzhizi715
2010-10-27
jaymsimusic 写道
在线升级会不会丢失原有应用所对应的数据库中的数据?
不会 我测试过了 呵呵
4 楼
nj_first
2010-10-27
不知道Android能不能做到这样开发,以模块的方式开发应用。我的设想是应用分成若干模块,这样可仅对其中需要升级的模块升级。
3 楼
jaymsimusic
2010-10-26
在线升级会不会丢失原有应用所对应的数据库中的数据?
2 楼
Ihavegotyou
2010-10-25
比较统一的方法可以看看豌豆荚, 他是比较 AndroidManifest.xml的 android:versionCode
1 楼
diyisoft
2010-10-25
思路还可以,代码也贡献了。不错
发表评论
-
豆瓣同城的客户端---豆邻1.0
2011-04-01 15:23 2106豆邻是豆瓣同城的android客户端。具有豆瓣同城的功 ... -
【原创】实现类似街旁网的分享足迹功能
2011-03-06 16:19 3168转载请注明出处 在sina微博上看到街旁网的客户端有 ... -
【原创】时客地图1.7
2011-03-03 00:23 1782时客地图是一款android上的app,目前的最新版本是1.7 ... -
【原创】时客地图1.6
2011-02-12 12:07 1235时客地图是一款android上的app,目前的最新版本是1.6 ... -
【原创】时客地图1.5
2011-01-28 13:18 1240时客地图是一款android上的app,目前的最新版本是1.5 ... -
使用基站、wifi实现定位
2010-11-26 17:28 17058转载请注明出处 android可以借助于gps ... -
关于自适应屏幕方向和大小的一些经验
2010-11-10 13:57 5035转载请注明出处 刚开始,我开发时选取的模拟 ... -
Android隐性Intent的例子
2010-11-02 17:38 7931转载请注明出处 Android的Intent分为两大 ... -
Android 线程超时的例子
2010-11-02 15:09 9334转载请注明出处 android的线程和java的线程是 ... -
在线升级Android应用程序完善版
2010-10-29 16:07 14467转载请注明出处 发一个完善版本的 思路还是原来的思路,上一篇 ... -
通过地名获得经纬度并标识在地图上
2010-10-19 17:30 6067转载请注明出处 主要是调用Geocoder的getFromL ... -
分享一款android的日历组件
2010-10-17 15:28 3875转载请注明出处 这个日历组 ... -
多个Activity跳转的小结
2010-10-17 15:03 21687转载请注明出处 在android开发中Activity相当于 ... -
时客1.4
2010-07-03 12:58 1218增加公交线路的详细信息: 1)公交线路的查询 2)公交站点途径 ... -
时客1.3
2010-06-15 22:36 1019在1.2版本中增加了地铁的查询功能,在1.3版本中新增了查询打 ... -
刚做的2款应用
2010-06-08 00:05 1187由于刚升级了android的固件到2.1,因此我也将我 ... -
比价器0.1版本
2010-06-01 23:23 1390做了一个比较当当 卓越 china-pub 图书的价格 ... -
时客1.0beta发布
2010-02-28 15:06 1019时客,可以查询火车班次、飞机航班 我在G2上 ... -
做了一个可以查询飞机航班、火车班次的小应用
2010-02-14 15:01 3537做得很粗糙,代码量也很少,数据通过调用web service得 ...
相关推荐
增量更新(差分升级)是Android应用程序开发中的一个重要技术,它允许用户仅下载自上次版本以来发生更改的部分代码,而不是整个应用的新版本。这大大减少了更新所需的网络带宽,提高了用户体验,同时也减轻了服务器...
本文将深入探讨“Android QQ程序代码”,揭示其中蕴含的技术要点和设计思路,帮助开发者提升Android应用开发的技艺。 首先,我们要明确,Android QQ程序是基于Android操作系统进行开发的,它利用了Java语言以及...
随着Android手机的广泛使用,Android应用程序的数据在各类案件,包括刑事、经济、政治以及高科技犯罪中扮演着重要证据的角色。针对Android应用的数据取证,已经成为司法调查和技术鉴定的关键环节。传统的取证方法...
【标题】"Android应用源码之安卓桌面应用EyeRoom.zip" 涵盖了Android应用程序开发的核心主题,特别是关于创建自定义安卓桌面应用的实践。这个压缩包包含了一个名为"EyeRoom"的桌面应用的源代码,这为我们提供了一个...
这个名为"android 记事程序"的应用程序专注于提供一个简洁的界面,让用户可以快速输入文字,完成基本的记事功能。下面我们将深入探讨这款应用可能包含的关键技术点和设计思路。 首先,Android应用开发的基础是Java...
增量升级的基本思路是对比新旧两个版本的应用程序,找出差异部分并生成补丁文件。这里,我们引入了`bsdiff`工具,它是用来生成二进制文件差异的算法,bsdiff4.3-win32.zip就是这个工具的Windows版本。在Android增量...
【Android应用版权保护】 ...本文提出的多维度分析方法为自动化检测盗版应用提供了新的思路,但实际应用中需结合其他手段,不断完善和升级,以应对日益复杂的破解技术,维护一个公平、健康的Android应用市场。
本资源是"Android随手记记账应用源码",主要面向的是对安卓(Android)开发感兴趣的开发者,特别是那些想要深入理解Android应用程序设计、财务应用开发或者想要自定义和学习记账类应用的程序员。这个源码提供了一个...
这篇解析将深入探讨该源码中的关键技术和设计思路,帮助开发者理解Android应用程序的开发流程,特别是针对联系人管理模块的实现。 1. **项目结构** 该项目遵循MVC(Model-View-Controller)架构,通常包含`java`、...
1. **应用程序层**:利用Android提供的组件API接口,开发了针对GPS导航的GPS和Google Maps电子地图的Java应用程序。 2. **应用框架层**:提供了应用程序之间交互的基本框架和支持。 3. **普通函数程序库**:包含了一...
源码中可能包含了Activity、Service、BroadcastReceiver等Android四大组件的实现,这些都是构建应用程序的基本元素。 点餐系统的用户界面(UI)是与用户交互的关键部分。在Android Studio中,开发者通常使用XML布局...
6. AndroidManifest.xml:AndroidManifest.xml是Android应用程序的配置文件,用于声明app的权限、组件和intent filter等信息。 相关概念: * Android静默安装 * 自动升级 * Root权限 * am start命令 * Linux命令 *...
这个学生信息管理系统是一个典型的Android应用程序,它实现了对学校学生信息的录入、查询、修改和删除等功能,为学校的教务管理工作提供了便利。系统的核心功能包括学生档案管理、成绩管理、课程管理等,通过简洁的...
1. **Android应用程序层**:利用Android提供的各种组件API接口,开发GPS和Google Map电子地图的Java应用程序。 2. **应用框架层**:提供应用程序间的交互机制和数据管理功能。 3. **普通函数程序库**:包括多媒体库...
- **Activity**:作为应用程序的基本组件,Activity代表用户可以看到和交互的屏幕。在OssSystem中,每个功能模块可能对应一个或多个Activity。 - **Intent**:Intent用于在不同的组件之间传递数据和启动服务,如...
在这个“Android_code.rar”压缩包中,包含了一个简单的个人记账应用程序,该程序主要利用了SQLite数据库进行数据存储,并且具有启动闪屏(Splash Screen)功能,这对于初学者来说是一个很好的学习实例。 1. **...
这样轻松实现了软件的功能扩展,而升级功能时只用更新对应插件, 而不是需要更新整个应用,降低了程序的耦合度. 而在Android中的实现思路,即为将一个较大的APK,分离为一个主程序的APK,和其他各
AIDL的基本思路是定义一个接口,该接口包含应用程序需要共享的方法。系统会自动生成与该接口对应的 Binder 类,使得在不同进程中的对象可以调用对方的方法,就像它们在同一个进程中一样。 描述中的“aidl实现多进程...
DnDNext,由Shane Herd和Dane Gilbert共同开发的Android应用程序,正是这样一款致力于提升D&D Next游戏体验的创新工具。本文将深入探讨该应用程序的核心功能、设计思路以及其背后的技术实现。 DnDNext的主要目标是...
在Android平台上,每个应用程序在安装时都需要获取一定的权限,这些权限包括访问联系人、短信、位置信息等敏感数据。恶意软件通常会滥用这些权限来窃取用户信息或进行其他恶意操作。因此,通过分析应用程序的权限...