android 浏览器 app层,framework层,webkit层消息的交互

来源:互联网 发布:mac uefi 编辑:程序博客网 时间:2024/06/05 04:42

          在android(4.0以上)平台基于webkit的原生浏览器中,通常app上层负责与用户交互的界面,例如点击页面中,识别不同种类的点击内容从而显示不同的上下文菜单。中间层通常是framework层(framework/base),这一层的主要职责是,将app层获得的用户请求,如点击链接,点击保存图片之类,转发往下层去;将下层处理好的内容,或者通过消息,或者通过中间代理类,来分发至上层,对用户展现出来。至于底层(external/webkit),不用说,自然是真正干活的部分。这里不会涉及技术上的细节,只是将上层往下层传递消息请求,下层执行完反馈给上层的大体路径给出说明,能力有限,肯定不是很全。

        路线1:

               app层部分:在浏览器长按点击事件-------->Controller(对点击的内容进行识别,图片,链接,或是其他类型),形成不同的菜单(如链接的话有打开链接的菜单项,图片则有保存图片,另存为等图片类型的菜单)-------->直接调webviewclassic对象------------>进入Framework层:在framework的webviewclassic函数中,打包成某个消息;将该消息向webviewCore发送出去------------------>webviewCore接收消息。该类中定义了一些能够与底层交互的函数,这些函数的特征是通常以native前缀开头,在消息处理部分中,可以直接用这些与底层对应的函数来获得底层功能。

     路线1指示了从上层到下层一层层的调用关系。某些过程是用消息来联通的,这就决定了,我们不可能直接将底层处理过后的消息或者其他内容直接通过函数调用来返回给最上层,即该路线是单向的。

 

   路线2: A: 从底层cpp函数中--------》调用framework层:Browserframe,在里面通过对象函数调用CallBackProxy---------> CallBackProxy中会调用webviewclient类(该类是个接口类)对象。注意这是个很神奇的对象,他可以被上层的一些类如Tab类继承实现,而这些类恰好大都是展示底层功能的上层类。于是乎我们只要在这些上层类中增加实现webviewclient类的成员函数的具体功能,这样在CallBackProxy调用webviewclient类的时候,自动调用我们实现的方法。

   路线3:在framewrok层的webviecore和webviewclassic,都有定义的callbackProxy的对象。于是,对于那种在weviewcore.java中直接调用底层webviewcore.cpp并返回需要的参数的情况 ,可以从路线2中直接截断到CallbackProxy调用webviewclient类的过程。

   总之,一句话,在底层像上层返回消息的过程中,很难绕开(可能有其他的方法,我也不太肯定)webviewclient这个中间接口类,我们所要做的就是webviewclient添加成员函数,并在上层的某个他的子类中去实现。

   

 

 

原创粉丝点击