當前位置:首頁 » 安卓系統 » android瀏覽器實現

android瀏覽器實現

發布時間: 2022-06-04 04:39:26

① 如何利用Chromium For Android開發Android瀏覽器

應用層次概念圖
layers 每個盒子代表一個概念中的應用層。通常情況下應該有可能通過替換任意一層及其上層組建來生成一個新的瀏覽器。因此,沒有任何層應該與其更高層次有依賴關系。 WebKit的:Safari,Chromium和其他所有基於WebKit的瀏覽器都使用Webkit作為渲染引擎。WebKit Port是WebKit的一部分,處理與具體平台相關的操作,如資源載入和圖形。 Glue: 將WebKit類型轉換成Chromium類型 。這就是我們的「WebKit嵌入層」。這是瀏覽器Chromium和test_shell(允許我們測試WebKit)的基礎。 Renderer/Render Host: 這是Chromium的「多進程嵌入層。」由它代理傳遞跨進程的消息和命令。你可以想像,其他的多進程瀏覽器也可以使用這一層,它對其他的瀏覽器服務沒有依賴。 Tab contents: Chrome的特有層,來表示標簽顯示的內容。它與應用服務綁定, 例如密碼管理器和history系統。本層不應該假設它嵌入在Chromium瀏覽器窗口中(還有其他Chromium組件如」HTML對話框「使用本層)。 瀏覽器:展現瀏覽器窗口,它嵌入了多個TabContentses。 WebKit 我們使用 WebKit這個開源項目來展示網頁。此代碼主要是由Apple編寫的並存放在/third_party/WebKit目錄中。WebKit主要包括兩部分:「WebCore」負責核心布局功能,「javaScriptCore」用來執行JavaScript。我們只將JavaScriptCore用於測試目的,通常我們使用高性能的V8 JavaScript引擎取代它。我們實際不使用蘋果稱之為「WebKit」的軟體層(譯注:就是WebKit/Source/WebKit目錄下的內容,Webkit/Source目錄下同樣有WebCore和JavaScriptCore目錄),這個軟體層用在如Safari這樣的應用程序中,用來銜接WebCore和OS X。為了方便,我們通常將從Apple獲取的代碼稱作「WebKit」。(譯注,其實只使用了WebCore) The WebKit Port 在最底層,我們有我們的WebKit「Port」。這是我們實現的平台相關的代碼,它用來銜接平台和WebCore。這些文件位於WebKit目錄中,通常在Chromium目錄中或者以Chromium為後綴名。實際上Port的大部分代碼不是和操作系統相關的:你可以把它看成是WebCore的Chromium Port(譯注:用來銜接WebKit和Chromium的)。有些部分,如字體渲染,必須針對每個操作系統平台分別處理。 網路流量是由我們的多進程資源載入系統處理的,而不是由渲染進程直接調用操作系統完成。 圖形使用為Android開發的Skia圖形庫。這是一個跨平台的圖形庫,原生的處理除了文字以外的所有圖形、圖像。Skia位於/third_party/skia。圖形操作的主要入口點是 / WebKit/port/platform/graphics/GraphicsContextSkia中。這個對象表示一個網頁。它處理所有從瀏覽器進程出入的與導航有關的命令。它繼承自RenderWidget,負責提供繪畫和輸入的處理。RenderView通過全局的(對每個渲染進程來說是全局,即每個進程一個)RenderProcess對象與瀏覽器進程通信。 常見問題:RenderView和RenderWidget的有什麼差異?RenderWidget通過實現名為WebWidgetDelegateglue層的抽象介面WebWidgetDelegate映射到一個的WebCore::Widget這基本上是屏幕上的一個窗口,它繪制窗口並接收窗口中的輸入事件。RenderView從RenderWidget繼承,它表示一個標簽或彈出窗口的內容。它處理所有導航命令並完成窗口繪制和響應輸入事件。只有一種情況下如RenderWidget獨立於RenderView存在:網頁上select boxes。它是個有向下箭頭和很多選項的彈出列表。在選擇框必須使用原聲窗口渲染,以便他們能夠在顯示在其他東西之上,並在必要時彈出框架。這些窗口需要繪制並接收輸入,但是他們不是一個單獨的「網頁」(RenderView)。 渲染器中的線程 每個渲染器中運行著兩個線程:渲染線程和主線程。渲染線程是RenderView和其他所有的WebKit代碼運行的線程。當它和瀏覽器之間進行通信時,首先將消息送到主線程,然後主線程再將消息傳遞給瀏覽器進程。只有主線程收到瀏覽器的回復之後渲染才可以繼續進行,這樣可以使我們同步地將消息從渲染器傳遞給瀏覽器。例如,當頁面中的JavaScript請求cookie時,渲染線程將被阻塞,主線程將所有收到的消息放入隊列直到接收到瀏覽器的正確回復。在這期間收到的任何消息都將按照順序發送給渲染線程進行處理。 瀏覽器進程 rendering browser 瀏覽器進程的底層對象 所有和渲染進程之間的通信都通過瀏覽器進程中的I/O線程實現的。它同樣也處理所有的網路通信,這樣可以不阻塞用戶界面。
當主線程初始化RenderProcessHost完畢後(用戶界面運行時),它建立新的渲染進程並新建名為ChanelProxy的IPC對象通過命名管道與之通信。這個對象運行於Browser的I/O線程中,監聽連接到渲染進程的命名管道,並將所有消息轉發到UI線程的RenderProcess對象。ResourceMessageFilter會過濾掉能夠直接執行的I/O處理消息,比如說網路請求。過濾使用ResourceMessageFilter::OnMessageReceived方法。 Ui線程中的RenderProcessHost負責分發所有顯示相關的消息給RenderViewHost(同時它也會處理有限的幾種非顯示相關的消息)。消息的分發在RenderProcessHost::OnMessageReceived函數執行。 瀏覽器進程的高層對象 顯示相關的消息會進入RenderViewHost::OnMessageReceived。大部分消息在這里處理,其他的則被轉發到RenderWidgetHost。渲染進程中有兩個對象對應到RenderView和RenderWidget對象。在Microsoft Windows上,對於每個RenderWigetHost都有一個RenderWidgetHostHWND與之對應,這個類專門負責管理消息事件並繪制原生的HWND。其他系統上也有類似的負責原生輸入和繪圖的對象。 在renderView/Widget對象之上是WebContent對象,大部分的消息都是在這個對象中響應的。WebContents表示一個tab中的內容。它繼承自通用的TabContents對象(還有其他集中TabContents的子類,比如下載頁面或歷史頁面)。它是大部分導航和頂層瀏覽器UI更新的結合點(switching point)。 FAQ:為什麼要分離WebContents和RenderViewHost對象?
原因有二:這兩個對象提供不同層面的功能。

② 安卓開發怎麼在APP內部調用手機系統瀏覽器打開指定html並獲取HTML的數據

Android開發_如何調用 瀏覽器訪問網頁和Html文件
一、啟動android默認瀏覽器

Intent intent= new Intent();
intent.setAction('android.intent.action.VIEW');
Uri content_url = Uri.parse('http://www.cnblogs.com');
intent.setData(content_url);
startActivity(intent);
這樣子,android就可以調用起手機默認的瀏覽器訪問。

二、指定相應的瀏覽器訪問
1、指定android自帶的瀏覽器訪問
( 「com.android.browser」:packagename ;「com.android.browser.BrowserActivity」:啟動主activity)
Intent intent= new Intent();
intent.setAction('android.intent.action.VIEW');
Uri content_url = Uri.parse('http://www.cnblogs.com');
intent.setData(content_url);
intent.setClassName('com.android.browser','com.android.browser.BrowserActivity');
startActivity(intent);
2、啟動其他瀏覽器(當然該瀏覽器必須安裝在機器上)
只要修改以下相應的packagename 和 主啟動activity即可調用其他瀏覽器

intent.setClassName('com.android.browser','com.android.browser.BrowserActivity');
uc瀏覽器':'com.uc.browser', 'com.uc.browser.ActivityUpdate「
opera :'com.opera.mini.android', 'com.opera.mini.android.Browser'
qq瀏覽器:'com.tencent.mtt', 'com.tencent.mtt.MainActivity'

三、打開本地html文件
打開本地的html文件的時候,一定要指定某個瀏覽器,而不能採用方式一來瀏覽,具體示例代碼如下

Intent intent= new Intent();
intent.setAction('android.intent.action.VIEW');
Uri content_url = Uri.parse('content://com.android.htmlfileprovider/sdcard/help.html');
intent.setData(content_url);
intent.setClassName('com.android.browser','com.android.browser.BrowserActivity');
startActivity(intent);

關鍵點是調用了」content「這個filter。
以前有在win32編程的朋友,可能會覺得用這種形式」file://sccard/help.html「是否可以,可以很肯定的跟你說,默認的瀏覽器設置是沒有對」file「這個進行解析的,如果要讓你的默認android瀏覽器有這個功能需要自己到android源碼修改manifest.xml文件,然後自己編譯瀏覽器代碼生成相應的apk包來重新在機器上安裝。

大體的步驟如下:

1、打開 packages/apps/Browser/AndroidManifest.xml文件把加到相應的後面就可以了

2、重新編譯打包,安裝,這樣子,新的瀏覽器就支持」file「這個形式了
有興趣的可以去試試。

③ android下打開Web瀏覽器的幾種常見的方法

android下打開Web瀏覽器的幾種常見的方法如下:

一。通過意圖實現瀏覽

//通過下述方法打開瀏覽器

privatevoidopenBrowser(){
//urlText是一個文本輸入框,輸入網站地址
//Uri是統一資源標識符
Uriuri=Uri.parse(urlText.getText().toString());
Intentintent=newIntent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}

注意:輸入URL時,不要忘記「http://」部分。

二。利用視圖打開網頁,是通過調用WebKit瀏覽器引擎提供的WebView實現的。

具體源代碼如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<LinearLayoutandroid:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<EditText
android:layout_width="240dp"
android:layout_height="wrap_content"
android:id="@+id/etWebSite"
android:hint="輸入網址"
android:singleLine="true"
android:layout_marginRight="5dp"
/>
<Button
android:id="@+id/searchBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索"
android:layout_marginRight="5dp"
/>
</LinearLayout>
<LinearLayoutandroid:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/backBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一頁"
android:layout_marginRight="5dp"
/>
<Button
android:id="@+id/nextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一頁"
android:layout_marginRight="5dp"
/>
</LinearLayout>
<WebViewandroid:id="@+id/webView1"android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
/res/src/com.myandroid


packagecom.myandroid;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.webkit.URLUtil;
importandroid.webkit.WebView;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
{

privateButtonschBtn,backBtn,nextBtn;
privateWebViewwebView;
privateEditTextmText;

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

schBtn=(Button)findViewById(R.id.searchBtn);
mText=(EditText)findViewById(R.id.etWebSite);
webView=(WebView)findViewById(R.id.webView1);
backBtn=(Button)findViewById(R.id.backBtn);
nextBtn=(Button)findViewById(R.id.nextBtn);
schBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
//設置可以使用Javascript
webView.getSettings().setJavaScriptEnabled(true);StringstrURI=mText.getText().toString();
//檢測網站的合法性
if(URLUtil.isNetworkUrl(strURI)){
webView.loadUrl(strURI);
Toast.makeText(WebViewActivity.this,strURI,Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(WebViewActivity.this,"輸入非法網站 "+strURI,Toast.LENGTH_SHORT).show();
}
}
});

backBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(webView.canGoBack()){
webView.goBack();
}
}
});

nextBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(webView.canGoForward()){
webView.goForward();
}
}
});
}
}


同時還要在AndroidManifest.xml中添加訪問網際網路的許可權:

<uses-permission android:name="android.permission.INTERNET"/>

④ 如何在Android中調用瀏覽器打開網頁

調用默認瀏覽器

Intentintent=newIntent();
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此處填鏈接");
intent.setData(content_url);
startActivity(intent);

其他瀏覽器

Intentintent=newIntent();
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此處填鏈接");
intent.setData(content_url);
intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");startActivity(intent);
uc瀏覽器":"com.uc.browser","com.uc.browser.ActivityUpdate「
opera:"com.opera.mini.android","com.opera.mini.android.Browser"
qq瀏覽器:"com.tencent.mtt","com.tencent.mtt.MainActivity"


求採納

⑤ android 怎麼讓系統瀏覽器打開指定鏈接

android實現通過瀏覽器點擊鏈接打開本地應用(APP)並拿到瀏覽器傳遞的數據 方法/步驟 為了實現這個功能可折騰了我好久,先上一份代碼,經樓主驗證是絕對可以用的而且也比較清晰的代碼!(ps:還是先劇透下吧,第三方大部分瀏覽器無法成功。) 點擊瀏覽器中的URL鏈接,啟動特定的App。 首先做成HTML的頁面,頁面內容格式如下: <a href="[scheme]://[host]/[path]?[query]">啟動應用程序</a> 這一句就可以了。 各個項目含義如下所示: scheme:判別啟動的App。 ※詳細後述 host:適當記述 path:傳值時必須的key ※沒有也可以 query:獲取值的Key和Value ※沒有也可以 作為測試好好寫了一下,如下: <a href="myapp://jp.app/openwith?name=zhangsan&age=26">啟動應用程序</a> 接下來是Android端。 首先在AndroidManifest.xml的MAIN Activity下追加以下內容。(啟動Activity時給予) ※必須添加項 <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/> </intent-filter> HTML記述的內容加入<data …/>。 其中必須的內容僅scheme,沒有其他內容app也能啟動。 ※注意事項:intent-filter的內容【android.intent.action.MAIN】和 【android.intent.category.LAUNCHER】這2個,不能與這次追加的內容混合。 所以,如果加入了同一個Activity,請按以下這樣做,否則會導致應用圖標在桌面消失等問題。 復制代碼 <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/> </intent-filter> 復制代碼 這樣的話,沒有問題。 接下來在Activity中需要取值的地方添加以下代碼,我是直接寫在OnCreate函數里的: Intent i_getvalue = getIntent(); String action = i_getvalue.getAction(); if(Intent.ACTION_VIEW.equals(action)){ Uri uri = i_getvalue.getData(); if(uri != null){ String name = uri.getQueryParameter("name"); String age= uri.getQueryParameter("age"); } } 這樣就能獲取到URL傳遞過來的值了。 ——————————————————————————————————我是分割線———————————————————————————————————— 代碼完了,是不是很驚奇的發現用瀏覽器輸入 myapp://jp.app/openwith?name=zhangsan&age=26 是不是404,打不開? 樓主你這不是騙人么!樓主你個混蛋啊。 客官,稍安勿躁啊,你看看你用的瀏覽器是什麼?UC,獵豹,歐朋?放棄吧,試試系統自帶瀏覽器或者谷歌瀏覽器吧。肯定能成功的,不能成功的話再來坑我。哈哈。 ——————————————————————————————————我是分割線———————————————————————————————————— 突然覺得好悲哀,好不容易get了這個技能,卻不能被第三方瀏覽器使用。在這個android瀏覽器大部分被第三方占據著的時代不得不說是個悲劇啊。 接下來還是說說為什麼第三方瀏覽器不能成功吧。首先,我發現的是UC瀏覽器,如果你使用了自己的scheme,而不是http的話,uc會默認在你的scheme前面添加。這太坑爹了。其他瀏覽器沒看是不是同樣的情況。發現這個問題後我就試著把自己的scheme換成http。然後滿懷期待的又跑了一遍,結果還是坑爹了。所以我想會不會是第三方瀏覽器對url做了處理。到這里,我也無可奈何了。我測試了UC,獵豹,歐朋,這3個都不支持。系統自帶的和谷歌瀏覽器是支持的。 最後再補充個線索吧,在瀏覽器里搜索網路應用。進了他們的頁面後,他們是可以實現在各種瀏覽器啟動已經安裝好的本地app的。看到這個後我就看了下他們頁面的源碼。 在這里他們頁面添加了個data-sentintent的標簽,看到這里,應該能確定第三方瀏覽器應該是默認都不支持發intent的,只能自己起一個。根據前端說,這個標簽應該是自定義的。我們前端看源碼的時候發現是這樣的 所以最後的結果應該是網路這邊是起了個埠,然後在應用里啟用了一個服務,來監聽這個埠,來獲取這個intent。大概就這個思路了。不過樓主沒有實際去操作。項目時間緊,太麻煩了。

⑥ android開發怎麼調用瀏覽器打開一個鏈接

在安卓代碼中調用瀏覽器來打開相應的網頁,一般有以下幾種方式

  1. 調用默認瀏覽器。

  2. 其他瀏覽器。

  3. 自定義一個簡單的WebView瀏覽器。

【原理】

主要是通過代碼進行調用已有或者未有的瀏覽器進行打開相應的網頁進行瀏覽。

【詳細實現步奏】

一.調用默認瀏覽器

優缺點:部分手機可能連默認的瀏覽器都沒有。


Intentintent=newIntent();
//Intentintent=newIntent(Intent.ACTION_VIEW,uri);
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此處填鏈接");
intent.setData(content_url);
startActivity(intent);

二.其他瀏覽器,制定打開

缺點:必須知道打開的瀏覽器的包名,大部分用戶可能沒有安裝這些瀏覽器

Intentintent=newIntent();
intent.setAction("android.intent.action.VIEW");
Uricontent_url=Uri.parse("此處填鏈接");
intent.setData(content_url);
intent.setClassName("瀏覽器包名","瀏覽器首頁");
startActivity(intent);


三.自定義一個簡單的WebView瀏覽器

優缺點:推薦使用,不必擔心手機上是否有瀏覽器。

mWebView=(WebView)findViewById(R.id.baseweb_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(newWebViewClient());
WebViewmyWebView=(WebView)findViewById(R.id.webview);
myWebView.loadUrl("xxx.com");

【最後】

每種方法根據個人需要進行選用,沒其他特別因素推薦使用第三種方案。

⑦ Android上開發手機瀏覽器原理是什麼

目前Google的Android平台上有幾款比較熱門的產品,比如說Opera Mini、Dolphin Browser、Firefox、UC以及手機QQ瀏覽器等,他們之間還是有一定的區別:

1. Opera Mini使用的是自己的渲染引擎,頁面經過重新排版處理,需要中間伺服器干預好處就是壓縮數據,省流量。

2. Dolphin Browser在國外用的比較多,國內用戶較少,這里不做過多介紹。

3. Firefox在Android平台上是因為Google推出了NDK,使用了mozilla自己的渲染引擎,支持Javascript解析,效率直逼Webkit內核,不過整體對W3C的支持大於桌面平台的IE。

4. UC是國內大家較熟知的產品前身為UCWEB,當初是為節省流量而設計類似Opera Mini,但對於JS腳本的支持無能為力,內部使用了自己的HTML解析器,當然現在的版本已經由伺服器中轉壓縮數據,不過渲染效果不如webkit和 firefox的效果好。

5. 手機QQ瀏覽器的實現類似UCWEB,比較山寨但UCWEB主要的功能都包含了在內。

6. GO瀏覽器是3G門戶推出的一款手機瀏覽器,和UC差不多,可以說是模仿。

熱點內容
網盤存儲文件 發布:2025-05-20 05:32:05 瀏覽:244
linux網卡的mac 發布:2025-05-20 05:31:13 瀏覽:6
手機照相機文件夾 發布:2025-05-20 05:29:49 瀏覽:847
數控車床電腦編程軟體 發布:2025-05-20 05:29:42 瀏覽:965
智能pos如何下載安卓 發布:2025-05-20 05:29:08 瀏覽:342
防病毒源碼 發布:2025-05-20 05:25:00 瀏覽:926
小米自動上傳 發布:2025-05-20 05:06:06 瀏覽:624
王者榮耀引流腳本 發布:2025-05-20 05:06:03 瀏覽:485
無人深空pc需要什麼配置 發布:2025-05-20 04:55:17 瀏覽:614
可編程式恆溫恆濕試驗箱 發布:2025-05-20 04:54:34 瀏覽:367