Android 软件自动更新功能的实现
2012-03-09 17:20
686 查看
一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获取最新的应用安装包呢?那么就要求我们从第一个版本就要实现升级模块这一功能。
自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉。
为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了。步骤分别如下:
第一步:新建一个Android工程命名为:UpdateDemo.代码结构如下图所示:
第二步:新建一个UpdateManager.java类,负责软件更新功能模块,代码如下:
第三步:在MainActivity.java也就是主Activity调用,代码如下:
第四步:添加程序所用的资源与权限:
下载的时候用到了ProgressBar,所以事先写了一个progress.xml布局文件,代码如下:
下载的时候用到了网络部分,所以要在AndroidManifest.xml中添加网络权限,代码如下:
第五步:运行查看效果如下:
图一:提示有最新包图二:点击开始下载
图三:下载完开始安装,我这里模拟器空间不足了。
自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉。
为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了。步骤分别如下:
第一步:新建一个Android工程命名为:UpdateDemo.代码结构如下图所示:
第二步:新建一个UpdateManager.java类,负责软件更新功能模块,代码如下:
001 | package com.tutor.update; |
002 |
003 | import
|
004 | import
|
005 | import
|
006 | import
|
007 | import
|
008 | import
|
009 | import
|
010 |
011 |
012 | import
|
013 | import
|
014 | import
|
015 | import
|
016 | import
|
017 | import
|
018 | import
|
019 | import
|
020 | import
|
021 | import
|
022 | import
|
023 | import
|
024 | import
|
025 |
026 | public class UpdateManager{ |
027 |
028 | private ContextmContext; |
029 |
030 | //提示语 |
031 | private StringupdateMsg= "有最新的软件包哦,亲快下载吧~" ; |
032 |
033 | //返回的安装包url |
034 | private StringapkUrl= "http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk" ; |
035 |
036 |
037 | private DialognoticeDialog; |
038 |
039 | private DialogdownloadDialog; |
040 | /*下载包安装路径*/ |
041 | privatestaticfinalStringsavePath="/sdcard/updatedemo/"; |
042 |
043 | privatestaticfinalStringsaveFileName=savePath+"UpdateDemoRelease.apk"; |
044 |
045 | /*进度条与通知ui刷新的handler和msg常量*/ |
046 | privateProgressBarmProgress; |
047 |
048 |
049 | privatestaticfinalintDOWN_UPDATE=1; |
050 |
051 | privatestaticfinalintDOWN_OVER=2; |
052 |
053 | privateintprogress; |
054 |
055 | privateThreaddownLoadThread; |
056 |
057 | privatebooleaninterceptFlag=false; |
058 |
059 | privateHandlermHandler=newHandler(){ |
060 | publicvoidhandleMessage(Messagemsg){ |
061 | switch(msg.what){ |
062 | caseDOWN_UPDATE: |
063 | mProgress.setProgress(progress); |
064 | break; |
065 | caseDOWN_OVER: |
066 |
067 | installApk(); |
068 | break; |
069 | default: |
070 | break; |
071 | } |
072 | }; |
073 | }; |
074 |
075 | publicUpdateManager(Contextcontext){ |
076 | this.mContext=context; |
077 | } |
078 |
079 | //外部接口让主Activity调用 |
080 | publicvoidcheckUpdateInfo(){ |
081 | showNoticeDialog(); |
082 | } |
083 |
084 |
085 | privatevoidshowNoticeDialog(){ |
086 | AlertDialog.Builderbuilder=newBuilder(mContext); |
087 | builder.setTitle("软件版本更新"); |
088 | builder.setMessage(updateMsg); |
089 | builder.setPositiveButton("下载",newOnClickListener(){ |
090 | @Override |
091 | publicvoidonClick(DialogInterfacedialog,intwhich){ |
092 | dialog.dismiss(); |
093 | showDownloadDialog(); |
094 | } |
095 | }); |
096 | builder.setNegativeButton("以后再说",newOnClickListener(){ |
097 | @Override |
098 | publicvoidonClick(DialogInterfacedialog,intwhich){ |
099 | dialog.dismiss(); |
100 | } |
101 | }); |
102 | noticeDialog=builder.create(); |
103 | noticeDialog.show(); |
104 | } |
105 |
106 | privatevoidshowDownloadDialog(){ |
107 | AlertDialog.Builderbuilder=newBuilder(mContext); |
108 | builder.setTitle("软件版本更新"); |
109 |
110 | finalLayoutInflaterinflater=LayoutInflater.from(mContext); |
111 | Viewv=inflater.inflate(R.layout.progress,null); |
112 | mProgress=(ProgressBar)v.findViewById(R.id.progress); |
113 |
114 | builder.setView(v); |
115 | builder.setNegativeButton("取消",newOnClickListener(){ |
116 | @Override |
117 | publicvoidonClick(DialogInterfacedialog,intwhich){ |
118 | dialog.dismiss(); |
119 | interceptFlag=true; |
120 | } |
121 | }); |
122 | downloadDialog=builder.create(); |
123 | downloadDialog.show(); |
124 |
125 | downloadApk(); |
126 | } |
127 |
128 | privateRunnablemdownApkRunnable=newRunnable(){ |
129 | @Override |
130 | publicvoidrun(){ |
131 | try{ |
132 | URLurl=newURL(apkUrl); |
133 |
134 | HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); |
135 | conn.connect(); |
136 | intlength=conn.getContentLength(); |
137 | InputStreamis=conn.getInputStream(); |
138 |
139 | Filefile=newFile(savePath); |
140 | if(!file.exists()){ |
141 | file.mkdir(); |
142 | } |
143 | StringapkFile=saveFileName; |
144 | FileApkFile=newFile(apkFile); |
145 | FileOutputStreamfos=newFileOutputStream(ApkFile); |
146 |
147 | intcount=0; |
148 | bytebuf[]=newbyte[1024]; |
149 |
150 | do{ |
151 | intnumread=is.read(buf); |
152 | count+=numread; |
153 | progress=(int)(((float)count/length)*100); |
154 | //更新进度 |
155 | mHandler.sendEmptyMessage(DOWN_UPDATE); |
156 | if(numread<=0){ |
157 | //下载完成通知安装 |
158 | mHandler.sendEmptyMessage(DOWN_OVER); |
159 | break; |
160 | } |
161 | fos.write(buf,0,numread); |
162 | }while(!interceptFlag);//点击取消就停止下载. |
163 |
164 | fos.close(); |
165 | is.close(); |
166 | }catch(MalformedURLExceptione){ |
167 | e.printStackTrace(); |
168 | }catch(IOExceptione){ |
169 | e.printStackTrace(); |
170 | } |
171 |
172 | } |
173 | }; |
174 |
175 | /** |
176 | *下载apk |
177 | *@paramurl |
178 | */ |
179 |
180 | privatevoiddownloadApk(){ |
181 | downLoadThread=newThread(mdownApkRunnable); |
182 | downLoadThread.start(); |
183 | } |
184 | /** |
185 | *安装apk |
186 | *@paramurl |
187 | */ |
188 | private void installApk(){ |
189 | Fileapkfile= new File(saveFileName); |
190 | if (!apkfile.exists()){ |
191 | return ; |
192 | } |
193 | Intenti= new Intent(Intent.ACTION_VIEW); |
194 | i.setDataAndType(Uri.parse( "file://" +apkfile.toString()), "application/vnd.android.package-archive" ); |
195 | mContext.startActivity(i); |
196 |
197 | } |
198 | } |
01 | package com.tutor.update; |
02 |
03 | import
|
04 | import
|
05 |
06 | public class MainAcitivity extends Activity{ |
07 |
08 |
09 | private UpdateManagermUpdateManager; |
10 | @Override |
11 | public void onCreate(BundlesavedInstanceState){ |
12 | super .onCreate(savedInstanceState); |
13 | setContentView(R.layout.main); |
14 |
15 | //这里来检测版本是否需要更新 |
16 | mUpdateManager= new UpdateManager( this ); |
17 | mUpdateManager.checkUpdateInfo(); |
18 | } |
19 | } |
下载的时候用到了ProgressBar,所以事先写了一个progress.xml布局文件,代码如下:
1 | <!--?xmlversion="1.0"encoding="utf-8"?--> < LINEARLAYOUT android:layout_height = "wrap_content" android:layout_width = "fill_parent" xmlns:android = "http://schemas.android.com/apk/res/android" > |
2 | < PROGRESSBAR style = "android:attr/progressBarStyleHorizontal" android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:id = "@+id/progress" ></ PROGRESSBAR ></ LINEARLAYOUT > |
1 | < USES-PERMISSION android:name = "android.permission.INTERNET" ></ USES-PERMISSION > |
图一:提示有最新包图二:点击开始下载
图三:下载完开始安装,我这里模拟器空间不足了。
相关文章推荐
- Android 软件自动更新功能实现的方法
- Android 软件自动更新功能的实现
- Android 软件自动更新功能实现的方法
- Android应用自动更新功能的实现!!!软件更新,自动下载,安装
- Android 软件自动更新功能的实现
- Android应用自动更新功能的实现!!!软件更新,自动下载,安装
- Android 软件自动更新功能的实现
- Android 软件自动更新功能的实现
- Android 软件自动更新功能的实现
- Android 软件自动更新功能实现的方法
- Android&nbsp;软件自动更新功能的实现
- (转)Android 软件自动更新功能的实现
- Android 软件自动更新功能的实现
- Android 软件自动更新功能的实现
- Android应用自动更新功能的实现!!!
- Android应用自动更新功能的代码实现
- Android应用自动更新功能的代码实现
- Android应用程序实现自动更新功能1_服务器端配置
- Android应用程序实现自动更新功能3_UI进度条设计
- Android应用自动更新功能的实现