一般安卓应用在设置选项都有版本更新的功能,方便用户及时更新到最新版本
应用内更新分为以下几个步骤:
1、通过接口获取线上版本号,versionCode
2、比较线上的versionCode 和本地的versionCode,弹出更新窗口
3、下载APK
4、安装APK
前两步比较简单
当我们点击版本更新按钮时,会向服务器发起版本检测的请求,把服务器返回的版本号跟当前安装的版本号比较:
1.如果返回的版本号大于当前安装的版本号,提示用户更新
2.如果不大于,提示用户当前为最新版本
(当然这个比较可以让后台服务器做,不过还是推荐客户端来操作)
重点是后两步
由于Android 各个版本对权限和隐私的收归和保护,因此,会出现各种的适配问题
一. 下载APK
apk下载其实就是文件下载,而文件下载有很多方式,很多第三方框架可以做到,这里我们采用最简单的 Android SDK 中的下载工具类DownLoadManager
关于DownLoadManager
的使用其实很简单,简单概括如下:
1. 使用DownloadManager
下载apk
(1)通过
getSystemService
获取DownLoadManager
。
(2)初始化DownLoadManager
的Request
,构建下载请求。
(3)调用DownLoadManager
的enqueue
异步发起请求,该方法返回值为标识当前下载任务的id,即downloadId
。
(4)当下载完成后,系统会发出条件为android.intent.action.DOWNLOAD_COMPLETE
的广播,我们可以自定义广播接受器,然后在onReceive中处理下载完成的逻辑即可。
注意:这里我们需要记住这个downloadId
,因为下载完成之后,我们需要根据这个ID 去查找apk文件,然后安装apk.
2.更新下载进度
下载文件,我们一般需要知道下载的进度,在界面给用户一个友好的提示,app 更新也是一样,我们需要在界面上显示当前下载进度和总进度,让用户知道大概会等待多久。那么如果获取下载进度呢?
在下载之前,我们需要在Activity
中注册一个Observer
,就是一个观察者,当下载进度变化的时候,就会通知观察者,从而更新进度。步骤如下:
1,首先我们先定义一个观察者
DownloadChangeObserver
来观察下载进度
2,在DownloadChangeObserver
中更新UI进度,给用户提示
3,下载之前,在Activity
中注册Observer
class DownloadChangeObserver extends ContentObserver {
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public DownloadChangeObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
updateView();
}
}
private void updateView() {
int[] bytesAndStatus = new int[]{0, 0, 0};
DownloadManager.Query query = new DownloadManager.Query().setFilterById(mReqId);
Cursor c = null;
try {
c = mDownloadManager.query(query);
if (c != null && c.moveToFirst()) {
//已经下载的字节数
bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
//总需下载的字节数
bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
//状态所在的列索引
bytesAndStatus[2] = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
}
} finally {
if (c != null) {
c.close();
}
}
if (mUpdateListener != null) {
mUpdateListener.update(bytesAndStatus[0], bytesAndStatus[1]);
}
Log.i(TAG, "下载进度:" + bytesAndStatus[0] + "/" + bytesAndStatus[1] + "");
}
根据前面我们记录的ID去查询进度,代码中已经注释了,不再多讲。
要想获取到进度,在下载之前,还得先注册DownloadChangeObserver,代码如下:
weakReference.get().getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true,
mDownLoadChangeObserver);
3. 获取下载结果
DownloadManager
在下载完成之后,会发送一个下载完成的广播DownloadManager.ACTION_DOWNLOAD_COMPLETE
,我们只需要监听这个广播,收到广播后, 获取apk文件安装。
定义一个广播DownloadReceiver
class DownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
// 安装APK
long completeDownLoadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Logger.e(TAG, "收到广播");
Uri uri;
Intent intentInstall = new Intent();
intentInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intentInstall.setAction(Intent.ACTION_VIEW);
if (completeDownLoadId == mReqId) {
uri = mDownloadManager.getUriForDownloadedFile(completeDownLoadId);
}
intentInstall.setDataAndType(uri, "application/vnd.android.package-archive");
context.startActivity(intentInstall);
}
}
通过上面的几个步骤,基本上就完成app在线更新功能,在Android 6.0以下可以正常运行。但是别忙,本文还没有结束,Android每一个版本都有一些改动,导致我们需要适配不同的版本,不然的话,就会出问题,结下来就看一下Android 6.0,7.0,8.0 的相关适配。
网友评论