我们开发的app一开始肯定都是1.0版本的,但应用上线后公司肯定后期会对应用进行维护对一些Bug修复。这时候新的版本出来了我们就可以通过自己的应用来检查是否有新版本,如果有新版本就可以让用户直接下载安装就不用再去应用市场搜索下载了。
大致思路是这样的:
1、每次打开项目判断一下现在的项目版本号与服务器上的版本号一不一样,不一样就弹出版本更新的dialog。
2、dialog点击”确定”开启服务,在后台进行下载。下载完成后发一个广播,进行新项目的安装。
3、下载使用DownloadManager下载管理器,下载完成,它会自己发一个广播,所以我们只需要写一个广播接受者即可。
4、在广播接受者里onReceive()方法里,进行项目的安装。
废话不多说,直接上代码。
判断版本号的代码:
private void checkVersion() {
//这是一个volley请求,UrlPath.URL_MVERSIONUPD是我的更新接口,里面包含,更新的版本号,更新的apk下载地址,更新的信息等各种信息。
App.getRequestInstance().post(UrlPath.URL_MVERSIONUPD, HomeActivity.this,
BeanUpdata.class, null, new RequestJsonListener<BeanUpdata>() {
@Override
public void requestSuccess(BeanUpdata result) {
//getAppVersionName()这是自定义的一个方法,用来获取当前版本的版本号。
String versionName = getAppVersionName(HomeActivity.this);
if (versionName.equals(result.getLatest())) {
//版本需要更新
showUpdateDialog(result.getMsgContent(), result.getUrl());
}
}
@Override
public void requestAgain(NodataFragment nodataFragment) {
nodataFragment.dismiss();
}
});
}
现在来看看,getAppVersionName()方法:
public static String getAppVersionName(Context context) {
String versionName = "";
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (Exception e) {
Toast.makeText(context, "获取versionName失败", Toast.LENGTH_SHORT).show();
}
return versionName;
}
showUpdateDialog()方法,是用来显示版本dialog:
public void showUpdateDialog(String msg, final String apkUrl) {
new MaterialDialog.Builder(this)
.title("有新版本")
.content(msg) //显示更新信息
.positiveColor(getResources().getColor(R.color.colorTextPrimary))
.positiveText("确认")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
//UpdataService是开启的服务,让下载在后台进行。用intent传递apk的下载地址
Intent intent = new Intent(HomeActivity.this, UpdataService.class);
intent.putExtra("url", apkUrl);
HomeActivity.this.startService(intent);
dialog.dismiss();
}
})
.negativeColor(getResources().getColor(R.color.colorTextPrimary))
.negativeText("取消")
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
}
UpdataService.class,现在看看后台的服务:
public class UpdataService extends Service {
/**
* 安卓系统下载类
**/
DownloadManager manager;
/**
* 接收下载完的广播
**/
DownloadCompleteReceiver receiver;
public UpdataService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 调用下载
initDownManager(intent);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if (receiver != null)
// unregisterReceiver(receiver);
super.onDestroy();
}
/**
* 初始化下载器
**/
private void initDownManager(Intent intent) {
manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
//这是自己的广播接受者
receiver = new DownloadCompleteReceiver();
//设置下载地址
DownloadManager.Request down = new DownloadManager.Request(
Uri.parse(intent.getStringExtra("url")));
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
| DownloadManager.Request.NETWORK_WIFI);
// 下载时,通知栏显示途中
/**
* request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
* 表示下载进行中和下载完成的通知栏是否显示。
* 默认只显示下载中通知。VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载完成后显示通知栏提示。
* VISIBILITY_HIDDEN表示不显示任何通知栏提示,
* 这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.
*/
down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
/**
* 显示下载界面
*/
down.setVisibleInDownloadsUi(true);
// 设置下载后文件存放的位置,第三个参数设置下载后文件存放的路劲
down.setDestinationInExternalFilesDir(this,
Environment.DIRECTORY_DOWNLOADS, "android_verync_shop.apk");
// 将下载请求放入队列
manager.enqueue(down);
//注册下载广播
registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
//停止服务并关闭广播
UpdataService.this.stopSelf();
}
}
现在来看看,广播接受者里的内容:
public class DownloadCompleteReceiver extends BroadcastReceiver {
/**
* 安卓系统下载类
**/
DownloadManager manager;
public DownloadCompleteReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
//获取下载的文件id
long downId = intent.getLongExtra(
DownloadManager.EXTRA_DOWNLOAD_ID, -1);
manager = (DownloadManager) context.getSystemService(context.DOWNLOAD_SERVICE);
//自动安装apk
installAPK(context,manager.getUriForDownloadedFile(downId));
}
}
/**
* 安装apk文件
*/
private void installAPK(Context context,Uri apk) {
Intent intents = new Intent();
intents.setAction("android.intent.action.VIEW");
intents.addCategory("android.intent.category.DEFAULT");
intents.setType("application/vnd.android.package-archive");
// intents.setData(apk);
intents.setDataAndType(Uri.fromFile(new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+"/maxiaobu.apk")), "application/vnd.android.package-archive");
intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intents);
}
}
一个项目的更新迭代就基本完事了。欢迎大神批评指点。