1. 程式人生 > >html5與安卓native互動,相互呼叫

html5與安卓native互動,相互呼叫

轉發自http://blog.csdn.net/a38017032/article/details/47700325

  • WebView的使用

WebView是Android中的一個類,主要是用來承載網頁的資訊。WebView中比較重要的資訊有三個類:WebChromeClientWebViewClientWebSettings

1.WebChromeClient:輔助WebView處理Javascript的對話方塊,載入進度條,網站圖示,網站title等等。 
(1)onProgressChanged(WebView view,int newProgress),通知現在的html載入的進度。 
(2)onReceivedTitle(WebView view,String title),通知現在的title。 
(3)onReceivedIcon(WebView view,Bitmap icon),通知現在的icon圖示。 
(4)onReceivedTouchIconUrl(WebView view, String url,boolean precomposed),通知現在的icon的url。 
(5)onJsPrompt(WebView iew,String url,String message,String defaultValue,JsPromptResult result),html通過js呼叫prompt的時候就會呼叫這個函式。 
(6)onJsAlert(WebView view,String url,String message,JsResult result), html通過js呼叫alert的時候就會呼叫這個函式。 
(7)onJsConfirm(WebView view, String url, String message,JsResult result),html通過js呼叫confirm的時候就會呼叫。 
(8)… 
2.WebViewClient

:幫助WebView處理各種通知、請求事件等等。 
(1)shouldOverrideUrlLoading(WebView view,String url),當點選html中的含有具有跳轉資訊的內容時都會回撥這個函式,告訴跳轉的url。 
(2)onPageStart(WebView view,String url,Bitmap favicon),當webview開始載入html的時候就會回撥這個函式。 
(3)onPageFinish(WebView view,String url),當webview載入完html的時候就會回撥這個函式。 
(4)… 
3.WebSettings:用來設定WebView的一些屬性。 
(1)setJavaScriptEnable(boolean flag),是否支援javascript。 
(2)setSupportZoom(boolean support),是否支援縮放。 
(3)… 
4.重要的方法 
(1)loadUrl(String url),載入一個url的資訊到WebView。 
(2)loadUrl(String url,Map< String,String> additionalHttpHeader),載入一個url,並且帶上一些url。 
(3)loadData(String data, String mimeType, String encoding),用來給WebView載入資料。 
(4)loadDataWithBaseURL(String baseUrl, String data,String mimeType, String encoding, String historyUrl),用來給WebView載入資料。 
(5)addJavascriptInterface(Object object,String name),將定義了回撥方法的物件object注入到webview中,這個時候webview中就可以通過name來呼叫native中的方法。

  • Html5載入Javascript的過程

在學會了使用WebView以後還需要適當的瞭解一下Javascript程式碼是如何載入到Html5中的,難道僅僅是< script >標籤就能將js的程式碼載入嗎?顯然不是。html5載入的時候是從上往下載入的,如果碰到js的程式碼或者碰到js的標籤,會通過Javascript解釋引擎載入進來,Javascript解釋引擎是瀏覽器的一部分。當Javascript程式碼執行的時候,會將相應的部分在渲染一次。

  • Native與Html5的互動方法

在大概的瞭解了WebView的時候,以及Html5的相關的知識以後就可以來看看如何的讓Native與Html5的互動。(現在很多的Native應用都會巢狀一些Html5的頁面在裡面,方便一些業務方面的) 
Native跳轉到Html5

的方式只有一種就是通過load的方式。 
上面介紹WebView時候時的loadUrl、loadData和loadDataWithBaseURL都能在Native中載入Html5的介面。這裡面也可以只加載部分分Javascript的程式碼。 
Html5跳轉到Native的方式則有比較多的方式。 
不使用js sdk時的互動 
(1)shouldOverrideUrlLoading,當點選WebView中承載過類似href的某個介面的時候。就會回撥這個方法。將需要處理的邏輯寫在shouldOverrideUrlLoading裡面就行。

webview.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return super.shouldOverrideUrlLoading(view, url);
        // doSomething
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(2)onJsPrompt(),onJsAlert()和onJsConfirm(),在html中設定prompt(),alert(),confirm(),點選的時候就會回撥到這些方法中。

<html>
    <body>
        <a href="javascript:prompt()">hello</a>
        <a href="javascript:alert()">haha</a>
        <a href="javascript:confirm()">gala</a>
    </body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

當分別點選的時候就會回撥到Native中。分別在裡面做處理就行 。

webview.setWebChromeClient(new WebChromeClient(){
    @Override
    public boolean onJsPrompt(WebView view, String url, String message,
            String defaultValue, JsPromptResult result) {
        // doSomething
        return super.onJsPrompt(view, url, message, defaultValue, result);
    }
    @Override
    public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
        // doSomething
        return super.onJsAlert(view, url, message, result);
    }
    @Override
    public boolean onJsConfirm(WebView view, String url,
                    String message, JsResult result) {
        // doSomething
        return super.onJsConfirm(view, url, message, result);
    }               
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

使用js sdk時的互動 
通過前面介紹WebView的時候,可以通過addJavascriptInterface(),將native端的方法注入到WebView中,這樣就可以通過一個name在html中呼叫native。 
將Object注入到WebView,識別符號號是egos。

webview.addJavascriptInterface(new Object(){
    @JavascriptInterface
    public void hello(String name){
        Toast.makeText(WebViewTest.this, name, Toast.LENGTH_SHORT).show();
    }
}, "egos");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在html中使用。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
    <script type="text/javascript">
    function test(){
        if(egos){
            egos.hello("egos");
        }
    }
    </script>
    </head>
    <body>
        <button onclick="javascript:test()">hello</button>
        <a href="javascript:test()">hello</a>
    </body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

點選以後就會彈出Toast。

  • 使用js sdk的優勢以及劣勢 
    優勢

1.對Javascript程式碼單獨的書寫,方便專案的開發和維護。 
2.方便應用的更新,WebView的更新只需要後臺的更新就行不需要移動端還做處理。

劣勢

使用addJavascriptInterface()在Android 17一下會有一個漏洞,使用起來不安全。在上面的程式碼中會發現hello(String name)上面加了一個@JavascriptInterface,這個是在Android 17以後處理這個漏洞的方法。在Android 17以後,想要安全的處理這個漏洞,肯定是不能再使用addJavascriptInterface()這個方法,現在可以使用的是前面的showOverrideUrlLoading(),或者是通過onJsPrompt(),onJsAlert()和onJsConfirm()這些方法。上面都有介紹。


相關推薦

html5native互動相互呼叫

轉發自http://blog.csdn.net/a38017032/article/details/47700325 WebView的使用 WebView是Android中的一個類,主要是用來承載網頁的資訊。WebView中比較重要的資訊有三個類:WebChromeC

Unity接入高德定位sdk簡單三步無需工程互動

原始碼,原工程下載地址:https://download.csdn.net/download/qq_37310110/10729281 參考地址:https://blog.csdn.net/qq_37310110/article/details/83145193 一:高德定位有效key的

Unity3d互動1.0

Unity : java.lang.NoSuchMethodError: no non-static method with name=‘OpenGallery’ signature=’()V’ in class Ljava.lang.Object; Unity : at com.unity

U3D & AS丨Unity互動

本帖為整合貼,學習各部落格方法,從這些方法中完善出一條成功互動的路   Unity與Android的互動方式 首先,我們要知道Unity與Android的互動方式有: 本部落格採用第一種方式進行互動,即將AS(AndroidStudio)匯出的arr包和Andro

webapp jsios怎麼互動

/*這段程式碼是固定的,必須要放到js中*/function setupWebViewJavascriptBridge(callback) { var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X

混淆之後androidjs互動異常原因

解決方案:需要js互動程式碼不被混淆掉,加入以下程式碼即可 -keepclassmembers class com.taohaohuo365.taohaohuo.activity.H5Activity$AndroidAndJSInterface { public *; } -keepcla

的進化用戶的陣痛?從奧利奧奧利粵說起

安卓今天,榮耀總裁趙明在微博上公布了榮耀手機EMUI 8.0的最新更新適配計劃,共計11款手機在列,既包括老款也包括新款。這一消息一經放出,引來了大量的關註。原因在於EMUI 8.0與以往的系統不同,這次更新是建立在Android 8.0奧利奧之上,而奧利奧包含了大量的底層優化,不僅更新過程需耗費大量人力財力

unity接入SDK,相互通訊

.接SDK是個什麼樣的活計? SDK的工作流程: 1. 從unity端出發,向安卓發起一系列的請求(unity call android)。 2. 安卓端收到unity端呼叫,然後在具體呼叫SDK的一系列介面(android內部呼叫) 3. SDK伺服器處理之後得到結果,再返回給安卓(網路通訊) 4

互動

var browser = { versions: function () { var a = navigator.userAgent, b = navigator.appVersion; return { trident: a

適配pxdp兩種適配方法

技術群裡一朋友最近在群裡抱怨適配好難好難,今天正好事情不多,所以來簡單的寫寫關於適配的文章。網上關於適配的文章實在太多,但是對於一些時間比較緊,想馬上提交程式碼的朋友並不是很試用。不再講使用相對佈局,執行緒佈局等內容,直接上乾貨。 朋友們先如果有時間就看看: 我也

vue實現、IOS互動

方案背景 IOS用的是jsBridge外掛實現呼叫、傳參、回撥的 安卓是在window掛載方法和掛載回撥的 IOS實現方案 呼叫原生方法封裝如下 function setupWebViewJavascriptBridge (callback) { if (window.W

Unity互動之拍照相簿

參考連結: 準備環境,我的是unity4.7.1 和 AndroidStudio 首先匯入unity目錄的 classes.jar 包到 AndroidStudio的 libs 目錄下 然後設定 build.gradle 刪除activity_

unity3d的資訊互動遇到的一些問題

1.class name (…) does not match path (jp/…/…class),如果是這個問題,說明打包路徑錯了,記住是在class檔案目錄下生產jar包 2.java.lang.IllegalArgumentException: already added: Lxxx

React-Native原生的混合開發

寫在前面 目前很多大廠APP(如淘寶、餓了麼、美團等等)並不是純原生Android&IOS,也不是純JS開發,而是Hybird APP開發,混合型優勢很多:比如熱更新,保證在一些類似雙十一的活動到來時能夠快速上線活動頁面,使用者不必再去更新APP。再來有效地減小了安裝包的體積

mac下搭建native開發環境(供rn使用)及rn相關命令

A:搭建安卓native開發環境在http://www.android-studio.org/下載最新的as,按步驟操作,新建工程,會去下載安裝一些gradle相關的東西;還有一些sdk和模擬器可能也需要手動安裝和建立。as的執行依賴於jdk,如果你的mac沒有安裝jdk需要

STM32F4+WIFI模組TCP連結伺服器伺服器客戶端Websocket長連結;實現監控資訊實時推送。

  哈哈哈哈哈!這是筆者第一次寫這種東西,專案是我們大二的一個大創組的專案:(雖然很沒創新,導師也一棒子打死了)但是我們還是硬著頭皮完成了。 1>硬體端:stm32f429,紅外線感應,esp8266模組,ov5640攝像頭,步進電機,等等。    主要是採集移動物

React Native 沉浸式標題欄全面屏適配

一:RN標題欄的適配很簡單,官方提供了一個原生元件,可以設定標題欄背景之類的<StatusBar backgroundColor={'#e34451'} />二:全面屏適配,  參考文件:https://android-developers.googleblog.

html5 ios的一些差異性問題

1.ios 下postion:fixed問題   問題描述:設計評論頁面,使用position:fixed定位將輸入框固定在頁面底部,如圖:      這種情況下,輸入框在獲取到焦點時,會隨著輸入法的彈出而上移。安卓的webview中是沒有問題的。而ios

native 和 H5 的互動

源生程式碼和H5的互動 android: 1: 預設的事情: android 通過內建的UI控制元件WebView來載入網頁。          網頁是用一個網路地址來表示的:          其整個使用方法很簡單如下:(android不關心實際的html5程式碼)

SpringMVC之間的互動1

接著上一篇 springMVC與jsp的互動,今天有空就測試了一下與安卓的互動 其實安卓與servlet互動和安卓與SpringMVC的互動一樣就是改變一下,目前我用的是get方法訪問SpringMVC,由於伺服器程式沿用的是與上次jsp一樣的程式碼,所以間接