对于安卓用户来说,手机应用更新是很频繁的,我们不能在每一次升级版本的时候,都让用户再去应用市场上重新下载一遍,这样是很不友好的。因此,在app里实现自动更新的功能,就显得很有必要了。
今天,就来聊一下,如何使用蒲公英第三方平台和DownLoadManager来实现app自动更新的功能。从以下三个方面来说明:**
- app自动更新流程阐述
- 如何集成第三方平台(蒲公英)
- 如何使用系统自带类DownloadManager来实现下载
一.app自动更新的流程:
二.如何集成第三方平台(蒲公英)
1.如何创建蒲公英的账号和应用,大家自行去蒲公英的官网操作,在这里就不过多说明。
2.导入依赖
compile 'com.pgyersdk:sdk:2.5.6'
3.添加权限:在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 获取设备信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取MAC地址 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写sdcard,storage等等 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 允许程序录制音频 -->
4.在AndroidManifest.xml中添加蒲公英提供的App key
<meta-data
android:name="PGYER_APPID"
android:value="蒲公英key" >
</meta-data>
5.在蒲公英上传你开发的app,获取你的蒲公英app key,将AndroidManifest.xml中的value值换成自己的蒲公英key
三.如何使用系统自带类DownloadManager来实现下载
1.DownloadManager简单介绍
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息。
2.新建ApkDownloadReceiver广播类来监听DownloadManager下载任务的状态,通过downloadId来查找下载的任务,如果下载完成,就去安装apk,如果下载失败,则弹出吐司提示。
public class ApkDownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent data) {
//获取下载任务的downloadId
long downloadId = data.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadId == PrefUtils.getApkDownloadId()) {
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
//通过downloadId来查找下载的任务
Cursor query = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));
try {
if (query.moveToFirst()) {
//获取下载任务的状态
int status = query.getInt(query.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
//下载暂停
case DownloadManager.STATUS_PAUSED:
break;
//下载延迟
case DownloadManager.STATUS_PENDING:
break;
//正在下载
case DownloadManager.STATUS_RUNNING:
break;
//下载完成
case DownloadManager.STATUS_SUCCESSFUL:
//下载完成安装APK
installApk(context,query);
break;
//下载失败
case DownloadManager.STATUS_FAILED:
//弹出提示
Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();
break;
}
}
} finally {
query.close();
}
}
}
private void installApk(Context context,Cursor query) {
String apkPath = query.getString(query.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, Uri.fromFile(new File(apkPath)));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
3.在AndroidManifest.xml监听下载广播完成的动作
<!--下载Apk-->
<receiver android:name="com.example.marvinma.pgyerupdatedemo.ApkDownloadReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</receiver>
4.在MainActivity onStart方法中去注册蒲公英,在onDestroy方法中去反注册。
@Override
protected void onStart() {
super.onStart();
//获取DownloadManager类
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
if (PrefUtils.getApkDownloadId() != -1) {
//通过保存的downloadId来获取索引
Cursor query = downloadManager.query(new DownloadManager.Query().
setFilterById(PrefUtils.getApkDownloadId()));
try {
if (query.moveToFirst()) {
//获取下载任务的状态
int status = query.getInt(query.getColumnIndex(DownloadManager.COLUMN_STATUS));
//如果已经在下载中,就返回,不再去下载
if (status == DownloadManager.STATUS_RUNNING) {
return;
} else {
//如果是其他状态,就将之前的下载记录移除
downloadManager.remove(query.getInt(query.getColumnIndex(DownloadManager.COLUMN_ID)));
PrefUtils.setApkDownloadId(-1);
}
}
} finally {
query.close();
}
}
//蒲公英注册
PgyUpdateManager.register(this,null,new UpdateManagerListener() {
@Override
public void onNoUpdateAvailable() {}
@Override
public void onUpdateAvailable(String s) {
final AppBean appBean = getAppBeanFromString(s);
VersionUtils.showUpdateDialog(MainActivity.this,appBean);
}
}
);
}
@Override
protected void onDestroy() {
super.onDestroy();
//蒲公英反注册
PgyUpdateManager.unregister();
}
5.下载的提示框
public class VersionUtils {
public static void showUpdateDialog(final Context context, final AppBean appBean) {
new AlertDialog.Builder(context)
.setTitle("发现新版本" + appBean.getVersionName())
.setMessage(appBean.getReleaseNote())
.setNegativeButton("暂时忽略", null)
.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
//将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件
long apkDownloadId = downloadManager.enqueue(new DownloadManager.Request(Uri.parse(appBean.getDownloadURL()))
.setVisibleInDownloadsUi(false));
Log.e("apkUrl",appBean.getDownloadURL());
//保存下载的id
PrefUtils.setApkDownloadId(apkDownloadId);
}
})
.show();
}
}
至此,使用DownloadMananger来实现下载的逻辑就完成了。接着,我们修改build.gradle的versionCode和versionName,在蒲公英上传新的app
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.marvinma.pgyerupdatedemo"
minSdkVersion 18
targetSdkVersion 25
versionCode 2
versionName "2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
效果图: