美文网首页
日更挑战-安卓开发之离线包模块实现方法

日更挑战-安卓开发之离线包模块实现方法

作者: 愿你我皆是黑马 | 来源:发表于2021-05-23 23:43 被阅读0次

越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过

挑战目录

什么是离线包

现如今的app大部分都不只是原生的了,一般都是原生加H5方式实现的。但是H5实现的网页要从服务端获取资源然后才能进行加载。用户体验收到多方面因素的影响。需要把web页面把静态资源生成zip包, 客户端在合适的时机拉去zip包并解压到本地。这个zip包就叫离线包。所以原生端开发离线包模块是很重要的一个模块。


一个离线包模块都需要实现哪些功能

一个离线包必备的功能包括:本地http服务、每次打开离线包时的md5验签、webview跨域解决、根据服务器接口判断离线包更新下载的情况、区分环境加载(现如今应用都有多套环境)、版本更新机制、白屏检测、预加载webview、访问离线包和远程网址的配置随意切换。

  • 本地http服务

    本地http服务有很多可选方案。为了简单起见选用AndroidAsync

    public class 本地服务封装类 implements CompletedCallback{
        private AsyncHttpServer server = new AsyncHttpServer();
        private static 本地服务封装类 sInstance = new 本地服务封装类();
        private ServerCallback serverCallback = new ServerCallback();
    
        private 本地服务封装类() {}
    
        public static 本地服务封装类 getInstance() {
            return sInstance;
        }
    
        public void 启动本地服务() {
            if (最大尝试服务开启次数-- <= 0) {
                外部调用Api管理器.get().error("-1111", "服务启动失败");
                return;
            }
            外部配置.get().resetPort();
            server.addAction("OPTIONS", "[\\d\\D]*", serverCallback);
            server.get("/.*?", serverCallback);
            server.setErrorCallback(this);
            server.listen(外部配置.get().get端口());
        }
    
        public void 停止本地服务() {
            AsyncServer.getDefault().stop();
            server.stop();
        }
    
        public boolean 判断服务是否允许中() {
            return AsyncServer.getDefault().isRunning();
        }
    
        public String 根据配置拼接本地服务地址(String vhost, String packId, String path) {
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (TextUtils.isEmpty(vhost)) {
                vhost = "https://localhost/";
            }
            if (!vhost.startsWith("http://") && !vhost.startsWith("https://")) {
                vhost = "https://" + vhost;
            }
            if (!vhost.endsWith("/")) {
                vhost = vhost + "/";
            }
            if (packId.endsWith("/")) {
                packId =  packId.substring(0, packId.length() - 1);
            }
            if (packId.startsWith("/")) {
                packId = packId.substring(1);
            }
            vhost = vhost + MD5Utils.md5Decode32(System.currentTimeMillis()+"")+"/";
            外部配置.get().addVHost(vhost);
            return vhost + packId + path;
        }
    
        public String 根据配置拼接远程服务地址(String remoteurl, String path) {
            if (!remoteurl.endsWith("/")) {
                remoteurl =  remoteurl+"/";
            }
            if (path.startsWith("/")) {
                path = path.substring(1);
            }
            return remoteurl + path;
        }
    
        private static final String TAG = "本地服务封装类";
        @Override
        public void onCompleted(Exception ex) {
            OLog.e( ex.getMessage());
            启动本地服务();
        }
    
        private int 最大尝试服务开启次数 = 100;
    }
    
  • 每次打开离线包时的md5验签

相关文章

网友评论

      本文标题:日更挑战-安卓开发之离线包模块实现方法

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