`
fengzhizi715
  • 浏览: 161625 次
  • 性别: Icon_minigender_1
  • 来自: 上海 苏州
社区版块
存档分类
最新评论

在线升级Android应用程序的思路

阅读更多
    转载请注明出处
 
    如果某个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  是哪里的呀? 自定义的吗? 貌似没有代码啊?
11 楼 lovext 2010-11-01  
不错,思路清晰。
10 楼 cnflood 2010-11-01  
不错不错,目前正需要这么个功能,先学习了
9 楼 fengzhizi715 2010-10-29  
程序改进了一下

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  
思路还可以,代码也贡献了。不错

相关推荐

    Android应用源码安卓增量更新(差分升级)项目

    增量更新(差分升级)是Android应用程序开发中的一个重要技术,它允许用户仅下载自上次版本以来发生更改的部分代码,而不是整个应用的新版本。这大大减少了更新所需的网络带宽,提高了用户体验,同时也减轻了服务器...

    Android QQ程序代码

    本文将深入探讨“Android QQ程序代码”,揭示其中蕴含的技术要点和设计思路,帮助开发者提升Android应用开发的技艺。 首先,我们要明确,Android QQ程序是基于Android操作系统进行开发的,它利用了Java语言以及...

    16 杜周Android应用取证分析研究1

    随着Android手机的广泛使用,Android应用程序的数据在各类案件,包括刑事、经济、政治以及高科技犯罪中扮演着重要证据的角色。针对Android应用的数据取证,已经成为司法调查和技术鉴定的关键环节。传统的取证方法...

    Android应用源码之安卓桌面应用EyeRoom.zip

    【标题】"Android应用源码之安卓桌面应用EyeRoom.zip" 涵盖了Android应用程序开发的核心主题,特别是关于创建自定义安卓桌面应用的实践。这个压缩包包含了一个名为"EyeRoom"的桌面应用的源代码,这为我们提供了一个...

    android 记事程序

    这个名为"android 记事程序"的应用程序专注于提供一个简洁的界面,让用户可以快速输入文字,完成基本的记事功能。下面我们将深入探讨这款应用可能包含的关键技术点和设计思路。 首先,Android应用开发的基础是Java...

    【第二节】android增量升级之使用so文件进行增量升级

    增量升级的基本思路是对比新旧两个版本的应用程序,找出差异部分并生成补丁文件。这里,我们引入了`bsdiff`工具,它是用来生成二进制文件差异的算法,bsdiff4.3-win32.zip就是这个工具的Windows版本。在Android增量...

    基于代码特征多维度分析实现Android应用的版权保护.pdf

    【Android应用版权保护】 ...本文提出的多维度分析方法为自动化检测盗版应用提供了新的思路,但实际应用中需结合其他手段,不断完善和升级,以应对日益复杂的破解技术,维护一个公平、健康的Android应用市场。

    Android随手记记账应用源码.zip

    本资源是"Android随手记记账应用源码",主要面向的是对安卓(Android)开发感兴趣的开发者,特别是那些想要深入理解Android应用程序设计、财务应用开发或者想要自定义和学习记账类应用的程序员。这个源码提供了一个...

    Android应用我的通讯录_安卓源码.zip

    这篇解析将深入探讨该源码中的关键技术和设计思路,帮助开发者理解Android应用程序的开发流程,特别是针对联系人管理模块的实现。 1. **项目结构** 该项目遵循MVC(Model-View-Controller)架构,通常包含`java`、...

    基于Android的GPS应用中的研究与开发

    1. **应用程序层**:利用Android提供的组件API接口,开发了针对GPS导航的GPS和Google Maps电子地图的Java应用程序。 2. **应用框架层**:提供了应用程序之间交互的基本框架和支持。 3. **普通函数程序库**:包含了一...

    Android应用源码之无线点餐系统-IT计算机-毕业设计.zip

    源码中可能包含了Activity、Service、BroadcastReceiver等Android四大组件的实现,这些都是构建应用程序的基本元素。 点餐系统的用户界面(UI)是与用户交互的关键部分。在Android Studio中,开发者通常使用XML布局...

    Android程序静默安装安装后重新启动APP的方法

    6. AndroidManifest.xml:AndroidManifest.xml是Android应用程序的配置文件,用于声明app的权限、组件和intent filter等信息。 相关概念: * Android静默安装 * 自动升级 * Root权限 * am start命令 * Linux命令 *...

    android学生信息管理系统(源码+项目报告文档).rar

    这个学生信息管理系统是一个典型的Android应用程序,它实现了对学校学生信息的录入、查询、修改和删除等功能,为学校的教务管理工作提供了便利。系统的核心功能包括学生档案管理、成绩管理、课程管理等,通过简洁的...

    Android系统嵌入式车载导航系统

    1. **Android应用程序层**:利用Android提供的各种组件API接口,开发GPS和Google Map电子地图的Java应用程序。 2. **应用框架层**:提供应用程序间的交互机制和数据管理功能。 3. **普通函数程序库**:包括多媒体库...

    android应用源码OssSystem(OA系统图书管理简单版).zip

    - **Activity**:作为应用程序的基本组件,Activity代表用户可以看到和交互的屏幕。在OssSystem中,每个功能模块可能对应一个或多个Activity。 - **Intent**:Intent用于在不同的组件之间传递数据和启动服务,如...

    Android_code.rar_android_android 启动

    在这个“Android_code.rar”压缩包中,包含了一个简单的个人记账应用程序,该程序主要利用了SQLite数据库进行数据存储,并且具有启动闪屏(Splash Screen)功能,这对于初学者来说是一个很好的学习实例。 1. **...

    Android应用开发中实现apk皮肤文件换肤的思路分析

    这样轻松实现了软件的功能扩展,而升级功能时只用更新对应插件, 而不是需要更新整个应用,降低了程序的耦合度. 而在Android中的实现思路,即为将一个较大的APK,分离为一个主程序的APK,和其他各

    Android多进程通讯AIDLDemo

    AIDL的基本思路是定义一个接口,该接口包含应用程序需要共享的方法。系统会自动生成与该接口对应的 Binder 类,使得在不同进程中的对象可以调用对方的方法,就像它们在同一个进程中一样。 描述中的“aidl实现多进程...

    DnDNext:这是我的 Shane Herd 和 Dane Gilbert 开发的 Android 应用程序。 此应用程序将允许用户更轻松地创建和管理龙与地下城第 5 版(D&D Next)的角色

    DnDNext,由Shane Herd和Dane Gilbert共同开发的Android应用程序,正是这样一款致力于提升D&D Next游戏体验的创新工具。本文将深入探讨该应用程序的核心功能、设计思路以及其背后的技术实现。 DnDNext的主要目标是...

    基于Android权限信息的恶意软件检测.pdf

    在Android平台上,每个应用程序在安装时都需要获取一定的权限,这些权限包括访问联系人、短信、位置信息等敏感数据。恶意软件通常会滥用这些权限来窃取用户信息或进行其他恶意操作。因此,通过分析应用程序的权限...

Global site tag (gtag.js) - Google Analytics