http://www.chenwg.com/android/android%e5%ba%94%e7%94%a8%e6%9b%b4%e6%96%b0.html
开发好的Android应用,在上线之后,往往会有更新,很多Android应用往往是这样做的,手机上打开Android应用,然后应用就会联网,获取远程服务器提供的Android应用的最新版本号,然后再和当前已安装的Android应用的版本号进行对比,如果远程服务器提供的Android应用的版本比已在手机上安装的应用的版本新,便提示用户下载更新。
AndroidManifest.xml这个文件的versionCode表示版本号,versionName表示版本名称 ,versionCode是整型数字,versionName是字符串类型,一般我们会用versionCode作为软件是否更新的参考。
下面是一个工具类,专门获取版本号和版本名称的,如下:
public class VersionUtil {
private static final String TAG = "VersionUtil";
/** * getVersionNo(获取应用的版本号) * @param context * @return */
public static int getVersionNo(Context context) {
int versionNo = -1;
try {
versionNo = context.getPackageManager().getPackageInfo(
"com.hxxy.androidupdateproject",
PackageManager.PERMISSION_GRANTED).versionCode;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return versionNo;
}
/** * getVersionName(获取应用的版本名称) * @param context * @return */
public static String getVersionName(Context context) {
String versionName = "";
try {
versionName = context.getPackageManager().getPackageInfo(
"com.hxxy.androidupdateproject",
PackageManager.PERMISSION_GRANTED).versionName;
} catch (NameNotFoundException e) {
Log.e(TAG, e.getMessage());
}
return versionName;
}
}
下面是MainActivity.java
public class MainActivity extends Activity {
/**
* @Fields TAG : 用于日志输出
*/
private static final String TAG = "MainActivity";
/**
* @Fields handler : 主要处理非main线程与main线程通信
*/
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
final SwInfo swInfo = (SwInfo) msg.obj;
if (swInfo != null) {
// 创建提示AlertDialog
AlertDialog alertDialog = new AlertDialog.Builder(
MainActivity.this).create();
// 如果软件版本为最新的
if (swInfo.isNew()) {
alertDialog.setTitle("您的版本为最新的!");
alertDialog.setMessage(getResources().getString(
R.string.update_dialog_hint, swInfo.pre_versionNo,
swInfo.pre_versionName, swInfo.versionNo,
swInfo.versionName));
alertDialog.setButton(
getResources().getString(
R.string.update_dialog_btn_ok),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 安装最新apk
installApk(swInfo.apkLocation);
}
});
alertDialog.setButton2(
getResources().getString(
R.string.update_dialog_btn_no),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 不作任何处理
}
});
// 显示对话框
alertDialog.show();
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 启动检查更新线程
new UpdateThread().start();
}
/**
* 根据位置安装apk
*
* @param location
*/
private void installApk(String location) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), location)),
"application/vnd.android.package-archive");
startActivity(intent);
}
// 检查软件版本信息线程
class UpdateThread extends Thread {
@Override
public void run() {
Properties props = new Properties();
InputStream in = null;
try {
// 本地properties文件中读取的版本号代替网络上获取的版本号
in = getClassLoader().getResourceAsStream("apk.properties");
props.load(in);
int lastest_versionCode = Integer.parseInt(props
.getProperty("lastest_versionCode"));
String lastest_versionName = props
.getProperty("lastest_versionName");
String apkLocation = props.getProperty("lastest_apk_location");
// 当前应用的版本号
int cur_versionCode = VersionUtil
.getVersionNo(MainActivity.this);
String cur_versionName = VersionUtil
.getVersionName(MainActivity.this);
SwInfo swInfo = new SwInfo(cur_versionCode,
lastest_versionCode, cur_versionName,
lastest_versionName, apkLocation);
// 从Android系统已经存在的全局消息池获取一个消息实例
Message msg = handler.obtainMessage();
msg.obj = swInfo;
msg.sendToTarget();
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} finally {
try {
in.close();
} catch (IOException e) {
Log.e(TAG, e.getMessage());
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class SwInfo {
int pre_versionNo;
int versionNo;
String pre_versionName;
String versionName;
String apkLocation;
public SwInfo(int pre_versionNo, int versionNo, String pre_versionName,
String versionName, String apkLocation) {
super();
this.pre_versionNo = pre_versionNo;
this.versionNo = versionNo;
this.pre_versionName = pre_versionName;
this.versionName = versionName;
this.apkLocation = apkLocation;
}
public boolean isNew() {
return versionNo > pre_versionNo;
}
}
}