各种平台软件更新做法差不多,大体做法如下:
1.服务器存放一个最新版本的xml文件,或者存在数据库,各种做法都可以。
1.1xml文件存储verCode verName updateUrl等信息
1.2用户安装的软件的verCode和服务器上取得的做比较,检测到版本低就更新
2.下面是Android手机软件版本更新的教程
2.1项目目录
2.2编写UpdateManager类
package
com.doublejun.update;
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
android.app.AlertDialog;
import
android.app.AlertDialog.Builder;
import
android.app.Dialog;
import
android.content.Context;
import
android.content.DialogInterface;
import
android.content.Intent;
import
android.content.DialogInterface.OnClickListener;
import
android.content.IntentFilter;
import
android.net.Uri;
import
android.os.Handler;
import
android.os.Message;
import
android.util.Log;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.widget.ProgressBar;
public
class
UpdateManager {
private
Context mContext;
private
final
String updateMsg =
"亲,有新版本,快下载吧!"
;
//下载消息提示
private
Dialog noticeDialog;
//下载提示对话框
private
Dialog downloadDialog;
//下载进度对话框
private
ProgressBar mProgressBar;
//进度条
private
Boolean interceptFlag =
false
;
//标记用户是否在下载过程中取消下载
private
Thread downloadApkThread =
null
;
//下载线程
private
final
String savePath =
"/sdcard/UpdateDemo/"
;
//下载的apk存放的路径
private
final
String saveFileName = savePath +
"hyjjrelease.apk"
;
//下载的apk文件
private
int
progress =
0
;
//下载进度
private
final
int
DOWNLOAD_ING =
1
;
//标记正在下载
private
final
int
DOWNLOAD_OVER =
2
;
//标记下载完成
private
final
String TAG=
"版本更新"
;
//日志打印标签
private
Handler mhandler =
new
Handler() {
//更新UI的handler
@Override
public
void
handleMessage(Message msg) {
super
.handleMessage(msg);
switch
(msg.what) {
case
DOWNLOAD_ING:
// 更新进度条
mProgressBar.setProgress(progress);
break
;
case
DOWNLOAD_OVER:
downloadDialog.dismiss();
installApk();
//安装
break
;
default
:
break
;
}
}
};
/*
* 构造方法
*/
public
UpdateManager(Context context) {
this
.mContext = context;
}
/*
* 检查是否有需要更新,具体比较版本xml
*/
public
void
checkUpdate() {
// 到服务器检查软件是否有新版本
//如果有则
showNoticeDialog();
}
/*
* 显示版本更新对话框
*/
private
void
showNoticeDialog() {
AlertDialog.Builder builder =
new
Builder(mContext);
builder.setTitle(
"版本更新"
);
builder.setMessage(updateMsg);
builder.setPositiveButton(
"更新"
,
new
OnClickListener() {
public
void
onClick(DialogInterface dialog,
int
which) {
noticeDialog.dismiss();
showDownloadDialog();
}
});
builder.setNegativeButton(
"以后再说"
,
new
OnClickListener() {
public
void
onClick(DialogInterface dialog,
int
which) {
noticeDialog.dismiss();
}
});
noticeDialog = builder.create();
noticeDialog.show();
}
/*
* 弹出下载进度对话框
*/
private
void
showDownloadDialog() {
AlertDialog.Builder builder =
new
Builder(mContext);
builder.setTitle(
"软件更新"
);
final
LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.progress,
null
);
mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);
builder.setView(v);
builder.setNegativeButton(
"取消"
,
new
OnClickListener() {
public
void
onClick(DialogInterface dialog,
int
which) {
downloadDialog.dismiss();
interceptFlag =
true
;
}
});
downloadDialog = builder.create();
downloadDialog.show();
downloadLatestVersionApk();
}
/*
* 下载最新的apk文件
*/
private
void
downloadLatestVersionApk() {
downloadApkThread =
new
Thread(downloadApkRunnable);
downloadApkThread.start();
}
//匿名内部类,apk文件下载线程
private
Runnable downloadApkRunnable =
new
Runnable() {
public
void
run() {
try
{
URL url =
new
URL(apkUrl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.connect();
int
length = conn.getContentLength();
Log.e(TAG,
"总字节数:"
+length);
InputStream is = conn.getInputStream();
File file =
new
File(savePath);
if
(!file.exists()) {
file.mkdir();
}
File apkFile =
new
File(saveFileName);
FileOutputStream out =
new
FileOutputStream(apkFile);
int
count =
0
;
int
readnum =
0
;
byte
[] buffer =
new
byte
[
1024
];
do
{
readnum = is.read(buffer);
count += readnum;
progress = (
int
) (((
float
) count / length) *
100
);
Log.e(TAG,
"下载进度"
+progress);
mhandler.sendEmptyMessage(DOWNLOAD_ING);
if
(readnum <=
0
) {
// 下载结束
mhandler.sendEmptyMessage(DOWNLOAD_OVER);
break
;
}
out.write(buffer,
0
,readnum);
}
while
(!interceptFlag);
is.close();
out.close();
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
}
};
/*
* 安装下载的apk文件
*/
private
void
installApk() {
File file=
new
File(saveFileName);
if
(!file.exists()){
return
;
}
Intent intent=
new
Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(
"file://"
+file.toString()),
"application/vnd.android.package-archive"
);
mContext.startActivity(intent);
}
}
|
2.2progress.xml文件
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<ProgressBar
android:id=
"@+id/updateProgress"
style=
"?android:attr/progressBarStyleHorizontal"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
/>
</LinearLayout>
|
2.3调用UpdateManager类
package
com.doublejun.update;
import
android.app.Activity;
import
android.os.Bundle;
public
class
Main
extends
Activity {
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
UpdateManager update =
new
UpdateManager(
this
);
update.checkUpdate();
}
}
|
好吧,就这些。希望对你有帮助。
转自http://www.cnblogs.com/doublejun/archive/2012/05/06/Android.html