2017-04-28
当下主流 APP , Hybrid app 中需要熟练掌握的交互知识(一)
2014年10月29日,万维网联盟宣布,经过接近8年的艰苦努力,该标准(HTML5)规范终于制定完成。接着,整个移动端开发领域开始了一场翻天覆地的改革变迁,主要「受益」者, ios , Android.
现如今的形势无疑使这个行业的门槛抬的非常高,我们都知道以前会写几个 demo 工作就没问题了,这是移动开发正火热的时期。之后接着有很多同学的自学效率不错,凭着一己之力,培训也算,每年大量新人涌入这个高薪行业!
前两天吃饭的时候 HR 告诉我说,他说两年前招 Android 的时候给出的价格是 15k,而且还招不到,如今 10 都不愿意给了,发一个职位来的人排着队面试 !可见移动行业的现状的确是跟之前的差距拉的太大。
包括我刚出来的时候基本没有接触过 WebApp 领域的东西,更不会去娴熟的利用 WebView 做着各种交互,以至于找工作就费了很大的力气,如今,Hybrid App 已然是绝对的主流地位!
什么是 Hybrid App
Native App(原生界面)+ WebApp (基于 H5 的 WebView 网页)== Hybrid App(混合型)
那这样一个公式就说的很清楚了,所谓的 Hybrid 就是原生与网页混合开发,有时候原生界面调 H5 页面,有时 H5 网页又来调原生,为什么会衍生出这种开发模式呢?H5 可跨平台,一套页面 ios 和 android 公用,开发成本较低,再者网页不占内存等等,一张图来稍微概括:
关于三者之间的对比这只是片面的,更多详细的资料大家自行搜索查看!虽然前两者的体验与性能都不会优于后者,但是大势所趋,我们谁也改变不了!
1. 使用 WebView 加载网页
这里没什么好说的,直接上代码:
|
|
我们首先利用 WebView 加载了这个网页,其次给他设置,解决浏览器跳转,显示加载进度条等等!
相信大家都很明白这还只是入门 Demo 的写法,那么在项目中我们是怎么处理这些设置和逻辑呢?
第一 :实际项目中的 WebView 存在与多个地方
第二 :原生与 Web 混合型
第三 : 网页大多数有他后台自己加好的逻辑与功能(包括 js 方法),怎么配合!
第四:你必须要做的 Cookie 处理
那么我们将以这几个问题开始进行分享,所以接下来会开是一个 HyBrid 主题系列的文章,估计会有好几篇!
2. 建立 Activity 管理类
这一步是项目开发必备,我们面对这越来越多的页面的时候,如果不管理,你总有无从下手的时候!
|
那么这三个方法解决了我们很多问题,包括由于资源未及时释放以及让你措手不及的 ANR,可别小看他!
以上写法的应用:在 Activity 中我们需要在项目初始化的时,用我们建好的这个类 ActivityClooector.addActivity() 来添加我们的 Activity 到栈中,同样的方法,在 Activity 将要销毁的时候去选择 remove 他,后面我们会在一些重要的类中(非 Activity)去用 getToopActivity() 来获取到我们的栈顶 Activity,非常重要!
3. 建立 WebViewController 管理类
那么这一步更加重要了,还记得我们第一小节是怎么设置 WebView 的吗?我们是在加载他的 Activity 中来进行设置的,那么当有多个页面时,又当每个页面加载 WebView 所要的设置数量不同的时候,就比较难处理了!
所以这里只用一个类来将项目中所有关于 WebView 的设置,以及 WebView 单层面的处理都放在这里!
先行列出 WebView 中常用设置以及方法
- WebSettings
|
- WebViewClient
设置WebViewClient:mWebView.setWebViewClient(new WebViewClient(){
这里包含以下方法
});
方法:
|
WebChromeClient mWebView.setWebViewClient(new WebChromeClient(){
同样例举出常用方法
});
方法:
|
下来列举我对于此模块的处理方法
我在这里建立了一个 WebViewCtroller类,用于将所有能用到设置以及需要添加的功能都写在里面,据我所知,只是现在普遍流行的一种写法,我们开始看,注释很详细!
|
其实说起来代码也不多,根据需求来添加即可。注意,这个类世纪城于 WebView 的!
关于如何知道网页服务端给我们传过来的是什么参数,以便于我们将参数填到所需的地方,这里就以这个在 WebView 中弹出原生的提示框为例!
如果不处理网页的 js 弹框,他是这样的:
那么这样用户体验就不好了!凡是网页时有 js 弹框的地方,我们都可以用在 setWebChromeClient(new WebChromeClient() {} 中 重写父类的 onJsAlert() 来讲之转换为原生弹框。
接下来我们打一个断点来追踪一下网页需要什么参数让我们传,关于网页服务端的所有接口都是这样来看参数的,所以你看好了!
可以看到,我在没有填密码的时候点击了修改密码,它就接着执行了这个方法,并且有一个 message 参数显示的是提示信息,那么我们直接就将这个 message 设置到我们原生弹框中所需要的消息就 OK 了!记住,后面的接口方法都是这么判断,再说一遍!
重点来了,将设置应用到 WebView 中去。
|
还记得上面类第一行的包吧!没错,就是把这个类的包路径直接加载布局中,像添加自定义布局的方式一样,现在起我们的 WebView 就已经具备了代码中所有的设置!
关于这个类(WebViewController),也我们专门用于处理 WebView 的看,如何去搭配下一个重头戏的类(HtmlMessageForLocal 类)!作用,本地与WebView交互类,根据点击的WebView位置服务端发送相应接口,本地去实现这些接口!非常重要!
此次就到这里,我们下篇文章继续,揭开这个 HtmlMessageForLocal 类的真实面目,并与我们的 WebViewController 类搭配起来完成所有网页的处理,此次分享落幕!
微信公众号「smartbeng」,吐血版珍藏持续更新,一个会爱上的公众号。
smartbeng