Webkit for android java层主要类库关系及浏览器实例讲解

来源:互联网 发布:犀牛软件 手机建模 编辑:程序博客网 时间:2024/06/05 08:38

安卓4.4  以前的框架


•Brower代表我们浏览器应用
•WebView API 的代码目录是/base/core/java/android/webkit
•JNI层用于桥接java和C++代码,  我们可以在WebViewCore.java文件中可以看到System.loadLibrary("webcore");

    之后就会跑到WebCoreJniOnload.cpp去执行

    JNI_Onload函数来注册需要的native函数

•C++层就是WebCore核心库和和大名鼎鼎的V8  javascript引擎
•Chromium_net是负责下载网页资源的IO线程

安卓原生浏览器APP代码浅析

先给个流程图



下面来分析一下代码

•主要对browser的java部分代码一个简单说明,主线基本上围绕着第一次打开browser加载网页的流程展开,同时顺便提了下App层几个主要类的关系。 打开browser第一个界面是 BrowserActivity.java.

•上面的代码做了下面几件事:
•1、 New了一个controller对象,
•2、根据当前设备是phone还是pad 初始化 UI, 我们电视上都是用的pad模式。
•3. 把ui传给 mController,让Controller持有UI的引用以便后面可以操作 UI。
•4.调用Controller.start函数打开第一个页面
•再稍微往下看两步,看看controller和UI 里面有什么。Controller的构造函数:
•public Controller(Activity browser, boolean preloadCrashState) {  
•       mActivity = browser;  
•       mSettings = BrowserSettings.getInstance();  
•       mTabControl = new TabControl(this);  
•       mSettings.setController(this);  
•      ……….省略了无关代码    
•       mFactory = new BrowserWebViewFactory(browser);  
•       ……..省略了无关代码    
•   }  


•这里有一个 Tabcontrol,用来管理Tab ,这个Tab是什么呢?这要看下前面 UI这个接口的实现了,UI接口的实现类是 BaseUI,phoneUI 和XlargerUI均继承于 BaseUI(这里是典型的面向对象设计 )。BaseUI 由Titlebar和 Tab两部分组成,Titlebar就是我们看到网址输入那部分,而 Tab就是下面的网页部分,在Tab.java的代码中,我们是可以找到 webview对象的,可以理解为Tab把 webview包装了一层。再回到controller这个类,注意controller是实现了webviewCotroller ,UiController接口的(注意tabcontroller可不是接口,它只是一个普通类),到这里有没有感觉controller.java这个类好强大,借助Tabcontroller管理着一组Tab,Tab 有webview的实例,controller再根据具体的Tab对象控制着每一个 webview。这家伙就是browserapp层的一个总管啊,只要能获得controller的引用,就可以完成界面 webview的控制。类的关系先说到这,下面还是看打开网页的流程吧,接先来看看 mController.start(intent); 干了些什么,具体的代码如下

•Controller.java里面

public void start(final Intentintent) {

       //WebViewClassic.setShouldMonitorWebCoreThread();

       // mCrashRecoverHandler hasany previously saved state.

       mCrashRecoveryHandler.startRecovery(intent);

   }

因为浏览器启动的时候需要查询上一次关闭时保存的浏览器状态信息,所以就用CrashRecoveryHandler来启动浏览器,其实最后他最后还是会跑回到controller里面做dostart

 startRecovery里面是啥?

•你看吧,最后又跑回Controller去做dostart()了,dostart做了下面这个事情(controller.java)

 GoogleAccountLogin.startLoginIfNeeded(mActivity,

                new Runnable() {

                    @Override publicvoid run() {

                        onPreloginFinished(icicle,intent,currentTabId,

                                restoreIncognitoTabs);

                    }

                });

红色字体的这部分,会执行下面内容

 if(urlData.isEmpty()){

                    t = openTabToHomePage();

                } else{

                    t = openTab(urlData);

                }

无论是openTabToHomePage();还是openTab(urlData);

都会经过一连串的调用,最后到达前面提到的Tab.java里面的loadUrl:

 publicvoidloadUrl(Stringurl,Map<String, String> headers) {

       if(mMainView!= null) {

            mPageLoadProgress =INITIAL_PROGRESS;

            mInPageLoad =true;

            isCurPageBackStatus=false;

            mCurrentState =newPageState(mContext,false,url,null);

            mWebViewController.onPageStarted(this,mMainView,null);

            mMainView.loadUrl(url,headers);

       }

   }

mMainView就是一个WebView对象(private WebViewmMainView;)

loadUrl之后就跑到framework层去工作了。









0 0
原创粉丝点击