美文网首页
版本更新

版本更新

作者: 贝贝ovo | 来源:发表于2018-10-17 00:09 被阅读28次

一般安卓应用在设置选项都有版本更新的功能,方便用户及时更新到最新版本
应用内更新分为以下几个步骤:

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)初始化DownLoadManagerRequest,构建下载请求。
(3)调用DownLoadManagerenqueue异步发起请求,该方法返回值为标识当前下载任务的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 的相关适配。

不想抄了 看原文
Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

Android实现App版本自动更新

我自己封装修改后的库github地址

相关文章

  • 版本更新

    【更新内容】测试更新 【更新内容】 【版本】0.9【版本】

  • 远程更新 - 草稿 - 草稿

    【版本】2.0【版本】 【链接】【链接】 【更新】更新啦!【更新】

  • npm 更新版本

    npm 更新到最新的版本或者更新到指定的版本 查看npm的当前版本 更新到最新版本: 更新到指定版本:

  • 上进远程更新

    【版本】1.1【版本】 【链接】【链接】 【更新】【更新】

  • 辞别新版远程更新

    【版本】2.0【版本】 【链接】【链接】 【更新】【更新】

  • 测试

    更新内容《新版本》更新内容 更新版本《3.0》更新版本 更新链接《https://www.lanzous》更新链接

  • WriteConcern

    版本信息 当前版本 v1.0 版本历史 版本 更新时间 更新人 更新内容 v1.0 2015/10/...

  • rjkgx

    更新版本【】更新版本 更新内容《》更新内容 更新链接〖〗更新链接

  • 版本更新

    一般安卓应用在设置选项都有版本更新的功能,方便用户及时更新到最新版本应用内更新分为以下几个步骤: 1、通过接口获取...

  • 版本更新

    【更新内容】测试版本【更新内容】【版本】1.0【版本】【大小】1.9mb【大小】【地址】www.baidu.com...

网友评论

      本文标题:版本更新

      本文链接:https://www.haomeiwen.com/subject/fxwkzftx.html