美文网首页
版本更新

版本更新

作者: 贝贝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地址

    相关文章

      网友评论

          本文标题:版本更新

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