刚刚做完一个关于服务器升级的demo,在此和大家分享下。
步聚一: Manifest.xml 先给Manifest.xml添加联网权限,读写SD卡权限,版本号versionCode和版本名versionName,其中versionCode用来比较版本使用的变量,versionName为用于显示在界面上的版本字符串。
步二: activity_main.xml 布局文件,简单的几个控件。 代码:
步三: MainActivity.Java 界面初始化,调用更新类的方法,刷新页面数据 代碼:
packagecom.example.servertest2;
import java.io.File;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
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.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
public static int version, serverVersion;
public static String versionName, serverVersionName, downloadResult;
private Button btn;
private ProgressBar proBar;
public static receiveVersionHandler handler;
private UpdateManager manager =UpdateManager.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
textView = (TextView) findViewById(R.id.textview_id);
btn = (Button) findViewById(R.id.button_id);
proBar = (ProgressBar) findViewById(R.id.progressBar_id);
Context c = this;
version = manager.getVersion(c);
textView.setText("当前版本号:" + version );
handler = new receiveVersionHandler();
// 检查更新按钮点击事件
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
manager.compareVersion(MainActivity.this);
}
});
}
public class receiveVersionHandler extends Handler {
@Override
public void handleMessage(Message msg) {
final ProgressDialog p = new ProgressDialog(MainActivity.this);
p.setProgressStyle(ProgressDialog.STYLE_SPINNER);
p.setTitle("正在下载");
p.setIndeterminate(true);
p.setButton("取消", new ProgressDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
p.dismiss();
}
});
p.show();
if (msg.arg1 == 1) {
p.dismiss();
ProgressDialog t = new ProgressDialog(MainActivity.this);
t.setProgressStyle(ProgressDialog.STYLE_SPINNER);
t.setTitle("下载成功");
t.setIndeterminate(true);
t.setButton("确定", new ProgressDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW);
String path = Environment.getExternalStorageDirectory() + "/CarsailSDK.apk";
intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive");
startActivity(intent);
}
});
t.show();
}
}
}
}
步四: UpdateManager.java 更新工具类,包含获取本地版本信息,服务器版本信息,下载apk文件等方法。 代碼:
packagecom.example.servertest2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.R.integer;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.ContactsContract.Contacts.Data;
import android.renderscript.Int2;
import android.util.Log;
public class UpdateManager {
int version = 0;
int versionnxt = 0;
private static UpdateManager manager = null;
public int getVersionnxt() {
return versionnxt;
}
public void setVersionnxt(int versionnxt) {
this.versionnxt = versionnxt;
}
private UpdateManager() {
}
public static UpdateManager getInstance() {
manager = new UpdateManager();
return manager;
}
// 获取版本号
public int getVersion(Context context) {
try {
version =context.getPackageManager().getPackageInfo("com.eric.androidupdatedemo", 0).versionCode;
} catch (Exception e) {
System.out.println("获取版本号异常!");
}
return version;
}
// 获取版本名
public String getVersionName(Context context) {
String versionName = null;
try {
versionName = context.getPackageManager().getPackageInfo("com.eric.androidupdatedemo", 0).versionName;
} catch (Exception e) {
System.out.println("获取版本名异常!");
}
return versionName;
}
// 获取服务器版本号
public String getServerVersion() {
String serverJson = null;
byte[] buffer = new byte[1024];
try {
URL serverURL = new URL("http://192.168.199.218/ver.aspx");
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
int n = 0;
while ((n = bis.read(buffer)) != -1) {
serverJson = new String(buffer);
}
} catch (Exception e) {
System.out.println("获取服务器版本号异常!" + e);
}
return serverJson;
}
// 比较服务器版本与本地版本弹出对话框
public boolean compareVersion(Context context) {
final Context contextTemp = context;
new Thread() {
public void run() {
Looper.prepare();
String serverJson = manager.getServerVersion();
// 解析Json数据
try {
JSONArray array = new JSONArray(serverJson);
JSONObject object = array.getJSONObject(0);
String getServerVersion = object.getString("version");
String getServerVersionName = object.getString("versionName");
Integer serverversion = new Integer(getServerVersion);
int versionnxt = serverversion;
System.out.println("serverversion" + serverversion + "!!version+" + version);
if (version < serverversion) {
// 弹出一个对话框
AlertDialog.Builder builder = new Builder(contextTemp);
builder.setTitle("版本更新");
builder.setMessage("当前版本:" + version + "\n" +
"服务器版本:" + serverversion);
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
// 开启线程下载apk
new Thread() {
public void run() {
Looper.prepare();
downloadApkFile(contextTemp);
Looper.loop();
};
}.start();
}
});
builder.setNegativeButton("下次再说", null);
builder.show();
} else {
AlertDialog.Builder builder = new Builder(contextTemp);
builder.setTitle("版本信息");
builder.setMessage("当前已经是最新版本");
builder.setPositiveButton("确定", null);
builder.show();
}
} catch (JSONException e) {
e.printStackTrace();
System.out.println("获取服务器版本线程异常!" + e);
}
Looper.loop();
};
}.start();
return false;
}
// 下载apk文件
public void downloadApkFile(Context context) {
String savePath = Environment.getExternalStorageDirectory() + "/test.apk";
String serverFilePath = "http://192.168.199.218/test.png";
try {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
URL serverURL = new URL(serverFilePath);
HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection();
BufferedInputStream bis = new BufferedInputStream(connect.getInputStream());
File apkfile = new File(savePath);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile));
long fileLength = connect.getContentLength();
Log.e("fileLength", "" + fileLength);
int downLength = 0;
int progress = 0;
int n;
byte[] buffer = new byte[1024];
while ((n = bis.read(buffer)) != -1) {
bos.write(buffer, 0, n);
downLength += n;
}
bis.close();
bos.close();
connect.disconnect();
Message msg = new Message();
msg.arg1 = 1;
MainActivity.handler.sendMessage(msg);
}
} catch (Exception e) {
System.out.println("下载出错!" + e);
}
}
}
最后导入commons-net-2.2.jar。 注: downloadApkFile(Context context)下载apk文件: 设置文件保存路径,服务器访问路径,通过HTTP协议下载文件,这里测试的时候,apk文件无法下载,故将服务器的apk修改扩展名为png格式,下载完成后保存为apk文件。