如题所述
ããandroidä¸js交äºæ两ç§æ¹å¼ï¼ç¬¬ä¸ç§æ¯éè¿ç³»ç»æä¾ç@JavascriptInterface注解å®ç°ï¼ç¬¬äºç§å°±æ¯js注å
¥ãä¸é¢æ¥è¯¦ç»è®²è§£ä¸ä¸äºè
ç使ç¨æ¹å¼ï¼åçï¼åºå«ã
ããä¸ã@JavascriptInterfaceå®ç°
ããå®ç°æ¥éª¤ï¼
ããa.设置WebViewæ¯æjsèæ¬
ããb.为æä¾ç»jsè°ç¨çæ¹æ³å ä¸@JavascriptInterface注解c.ç»WebViewæ·»å jsæ¥å£
ãã[java] view plain copy
ããwebView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new JSMethod(mContext), "lh");public class JSMethod {
ããprivate Context mContext;
ããpublic JSMethod(Context mContext) {
ããthis.mContext = mContext;
ãã}
ãã@JavascriptInterface
ããpublic void toast(String msg) {
ããToast.makeText(mContext, msg == null ? "" : msg, Toast.LENGTH_SHORT).show();}
ãã}
ããjs端è°ç¨androidæ¹æ³ï¼
ãã[javascript] view plain copy
ããlh.toast("Hello,China!");
ããandroid端æ§è¡jsæ¹æ³:
ãã[java] view plain copy
ããwebView.loadUrl("javascript:console(" + "'Hello,China!'" + ")"");äºãjsæ³¨å ¥å®ç°
ããå æ¥è¯´è¯´åçå§ï¼å½jsè°ç¨prompt()æ¹æ³æ¶ï¼WebChromeClient.onJsPrompt()æ¹æ³ä¼è¢«è§¦åï¼å½js触åAndroidæä¾çæ¥å£æ¹æ³æ¶ï¼å°è¯¥æ¹æ³çæ¹æ³å称ãåæ°ç±»åãåæ°å¼è½¬æjsonï¼ç¶åéè¿promptæ¹æ³ä¼ éç»android端ï¼android端解æjson并éè¿åå°æ§è¡å¯¹åºçæ¹æ³ï¼åæ¶ä¹æ¯ææ§è¡å¿ååè°ã
ããæ´ä¸ªæµç¨æ¯è¾å¤æï¼çå¾ï¼
ãã为WebViewç»å®WebChormeClientçå¬ï¼å¨Htmlå è½½è¿åº¦25%æ¶è¿è¡jsæ³¨å ¥(æ³¨å ¥çjsæ¯æ ¹æ®androidæä¾ç»jsç对象类åå¨æçæ);å¨ææ³¨å ¥çjs代ç å¦ä¸:
ãã[javascript] view plain copy
ããjavascript: (function(b) {
ããconsole.log("HostApp initialization begin");var a = {
ããqueue: [],
ããcallback: function() {
ããvar d = Array.prototype.slice.call(arguments, 0);//è·å该å½æ°åæ°å¹¶è½¬æ¢ä¸ºArrayæ°ç»var c = d.shift();//åå¾æ°ç»ç¬¬ä¸ä¸ªå ç´
ããvar e = d.shift();
ããthis.queue[c].apply(this, d);//æ°å»ºä¸ä¸ªå¯¹è±¡ å±æ§å称为åå¾çcï¼å¹¶å°dæ°ç»ä½ä¸ºä»çå¼ãç¶åå°è¿ä¸ªå¯¹è±¡pushå°queueæ°ç»if(!e) {//e为空çæ¶åï¼å°queueæ°ç»å±æ§å称为cç对象å é¤delete this.queue[c]
ãã}
ãã}
ãã};
ãã//åç§èµå¼ï¼æåé½çäºåä¸ä¸ªå½æ°
ããa.alert = a.alert = a.alert = a.delayJsCallBack = a.getIMSI = a.getOsSdk = a.goBack = a.overloadMethod = a.overloadMethod = a.passJson2Java = a.passLongType = a.retBackPassJson = a.retJavaObject = a.testLossTime = a.toast = a.toast = function() {var f = Array.prototype.slice.call(arguments, 0);if(f.length < 1) {
ããthrow "HostApp call error, message:miss method name"}
ããvar e = [];
ãã//æ¤æ®µå¤æï¼ç¶åèµå¼
ããfor(var h = 1; h < f.length; h++) {
ããvar c = f[h];
ããvar j = typeof c;
ããe[e.length] = j;
ããif(j == "function") {
ããvar d = a.queue.length;
ããa.queue[d] = c;
ããf[h] = d
ãã}
ãã}
ãã//å°å¿å对象{method: f.shift(),types: e,args: f}转æ¢æjsonå符串并ç¨æµè§å¨å¼¹åºç¡®è®¤å¯è¾å ¥æ¡ï¼ç¶ååå¾è¾å ¥æ¡çå¼jsonåºåå为js对象var g = JSON.parse(prompt(JSON.stringify({method: f.shift(),
ããtypes: e,
ããargs: f
ãã})));
ããif(g.code != 200) {
ããthrow "HostApp call error, code:" + g.code + ", message:" + g.result}
ããreturn g.result
ãã};
ãã//è·åaçå±æ§å¼ï¼ç¶å循ç¯
ããObject.getOwnPropertyNames(a).forEach(function(d) {var c = a[d];
ãã//å¤æèµå¼
ããif(typeof c === "function" && d !== "callback") {a[d] = function() {
ãã//concat è¿æ¥ä¸¤ä¸ªæ°ç»
ããreturn c.apply(a, [d].concat(Array.prototype.slice.call(arguments, 0)))}
ãã}
ãã});
ããb.HostApp = a;
ããconsole.log("HostApp initialization end")})(window);//éå å½æ°é»è®¤æ§è¡ï¼ç¶åèµç»windowãè¿æ ·window.bå°±å¯ä»¥æ§è¡äº b.HostAppå°±æ¯æ§è¡açå 容ï¼ä½æ¯aå ·ä½å¤çé»è¾ä¸å¯¹å¤å¼æ¾ï¼é¿å å¤é¨æ±¡æaå é¨é»è¾ä»£ç ä¸é¾ï¼å¯ä»¥èªè¡ç解ï¼å ¶ä¸åè°å½æ°è¢«å°è£ å¨äºa对象éé¢ï¼ç¡®ä¿android端å¯ä»¥éè¿webview.loadUrl()æ§è¡åè°ã
ããandroid端åè°js代ç å¦ä¸ï¼
ãã[javascript] view plain copy
ããjavascript:HostApp.callback(0, 0 ,"call back haha");androidæä¾çæ¯ä¸ä¸ªjsæ¹æ³é½å¯¹åºä¸ä¸ªJsCallback对象ï¼androidå°±å¯ä»¥éè¿JsCallback对象æ¥çæ并æ§è¡åè°jsç代ç ã
ããä¸ãä¼ç¼ºç¹
ããa.第ä¸ç§æ¹å¼ä¸å®å ¨ï¼ä¸æ·»å addJavascriptInterface,çè³é»è®¤false,å¨ä½äºAPI17çWebViewä¸é»è®¤æ·»å "SearchBoxJavaBridge_"å°mJavaScriptObjectsä¸ãè¿æ ·å°±æå¯è½éè¿ç¨æ·ä¿¡ä»»ç客æ·ç«¯è·åSDå¡çæ°æ®ï¼b.第ä¸ç§æ¹å¼å¿ é¡»è¦API大äºçäº17æè½ä½¿ç¨
ããc.第ä¸ç§æ¹å¼å½æjsåè°å½æ°éè¦android端æ§è¡æ¶ï¼é½éè¦å°å¿ååè°å½æ°èµå¼ç»å ¨å±å½æ°æè½ä¾android端åè°ï¼å¢å äºjsåandroid端éä¿¡çå°è£ å±çä½æ代ç éï¼è第äºç§æ¹å¼åæ¯éè¿å¨ææ³¨å ¥jsçæ¹å¼åé常æ¹ä¾¿ã
ããd.第äºç§æ¹å¼ä¹æä¸å®éå¶ï¼æ¯å¦androidæä¾çæ¹æ³å¿ é¡»æ¯static修饰çï¼ä¸æ¹æ³ç¬¬ä¸ä¸ªåæ°å¿ 须为WebView,ä¸è¿è¿ä¸å½±å使ç¨ã
ããä¸ã@JavascriptInterfaceå®ç°
ããå®ç°æ¥éª¤ï¼
ããa.设置WebViewæ¯æjsèæ¬
ããb.为æä¾ç»jsè°ç¨çæ¹æ³å ä¸@JavascriptInterface注解c.ç»WebViewæ·»å jsæ¥å£
ãã[java] view plain copy
ããwebView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new JSMethod(mContext), "lh");public class JSMethod {
ããprivate Context mContext;
ããpublic JSMethod(Context mContext) {
ããthis.mContext = mContext;
ãã}
ãã@JavascriptInterface
ããpublic void toast(String msg) {
ããToast.makeText(mContext, msg == null ? "" : msg, Toast.LENGTH_SHORT).show();}
ãã}
ããjs端è°ç¨androidæ¹æ³ï¼
ãã[javascript] view plain copy
ããlh.toast("Hello,China!");
ããandroid端æ§è¡jsæ¹æ³:
ãã[java] view plain copy
ããwebView.loadUrl("javascript:console(" + "'Hello,China!'" + ")"");äºãjsæ³¨å ¥å®ç°
ããå æ¥è¯´è¯´åçå§ï¼å½jsè°ç¨prompt()æ¹æ³æ¶ï¼WebChromeClient.onJsPrompt()æ¹æ³ä¼è¢«è§¦åï¼å½js触åAndroidæä¾çæ¥å£æ¹æ³æ¶ï¼å°è¯¥æ¹æ³çæ¹æ³å称ãåæ°ç±»åãåæ°å¼è½¬æjsonï¼ç¶åéè¿promptæ¹æ³ä¼ éç»android端ï¼android端解æjson并éè¿åå°æ§è¡å¯¹åºçæ¹æ³ï¼åæ¶ä¹æ¯ææ§è¡å¿ååè°ã
ããæ´ä¸ªæµç¨æ¯è¾å¤æï¼çå¾ï¼
ãã为WebViewç»å®WebChormeClientçå¬ï¼å¨Htmlå è½½è¿åº¦25%æ¶è¿è¡jsæ³¨å ¥(æ³¨å ¥çjsæ¯æ ¹æ®androidæä¾ç»jsç对象类åå¨æçæ);å¨ææ³¨å ¥çjs代ç å¦ä¸:
ãã[javascript] view plain copy
ããjavascript: (function(b) {
ããconsole.log("HostApp initialization begin");var a = {
ããqueue: [],
ããcallback: function() {
ããvar d = Array.prototype.slice.call(arguments, 0);//è·å该å½æ°åæ°å¹¶è½¬æ¢ä¸ºArrayæ°ç»var c = d.shift();//åå¾æ°ç»ç¬¬ä¸ä¸ªå ç´
ããvar e = d.shift();
ããthis.queue[c].apply(this, d);//æ°å»ºä¸ä¸ªå¯¹è±¡ å±æ§å称为åå¾çcï¼å¹¶å°dæ°ç»ä½ä¸ºä»çå¼ãç¶åå°è¿ä¸ªå¯¹è±¡pushå°queueæ°ç»if(!e) {//e为空çæ¶åï¼å°queueæ°ç»å±æ§å称为cç对象å é¤delete this.queue[c]
ãã}
ãã}
ãã};
ãã//åç§èµå¼ï¼æåé½çäºåä¸ä¸ªå½æ°
ããa.alert = a.alert = a.alert = a.delayJsCallBack = a.getIMSI = a.getOsSdk = a.goBack = a.overloadMethod = a.overloadMethod = a.passJson2Java = a.passLongType = a.retBackPassJson = a.retJavaObject = a.testLossTime = a.toast = a.toast = function() {var f = Array.prototype.slice.call(arguments, 0);if(f.length < 1) {
ããthrow "HostApp call error, message:miss method name"}
ããvar e = [];
ãã//æ¤æ®µå¤æï¼ç¶åèµå¼
ããfor(var h = 1; h < f.length; h++) {
ããvar c = f[h];
ããvar j = typeof c;
ããe[e.length] = j;
ããif(j == "function") {
ããvar d = a.queue.length;
ããa.queue[d] = c;
ããf[h] = d
ãã}
ãã}
ãã//å°å¿å对象{method: f.shift(),types: e,args: f}转æ¢æjsonå符串并ç¨æµè§å¨å¼¹åºç¡®è®¤å¯è¾å ¥æ¡ï¼ç¶ååå¾è¾å ¥æ¡çå¼jsonåºåå为js对象var g = JSON.parse(prompt(JSON.stringify({method: f.shift(),
ããtypes: e,
ããargs: f
ãã})));
ããif(g.code != 200) {
ããthrow "HostApp call error, code:" + g.code + ", message:" + g.result}
ããreturn g.result
ãã};
ãã//è·åaçå±æ§å¼ï¼ç¶å循ç¯
ããObject.getOwnPropertyNames(a).forEach(function(d) {var c = a[d];
ãã//å¤æèµå¼
ããif(typeof c === "function" && d !== "callback") {a[d] = function() {
ãã//concat è¿æ¥ä¸¤ä¸ªæ°ç»
ããreturn c.apply(a, [d].concat(Array.prototype.slice.call(arguments, 0)))}
ãã}
ãã});
ããb.HostApp = a;
ããconsole.log("HostApp initialization end")})(window);//éå å½æ°é»è®¤æ§è¡ï¼ç¶åèµç»windowãè¿æ ·window.bå°±å¯ä»¥æ§è¡äº b.HostAppå°±æ¯æ§è¡açå 容ï¼ä½æ¯aå ·ä½å¤çé»è¾ä¸å¯¹å¤å¼æ¾ï¼é¿å å¤é¨æ±¡æaå é¨é»è¾ä»£ç ä¸é¾ï¼å¯ä»¥èªè¡ç解ï¼å ¶ä¸åè°å½æ°è¢«å°è£ å¨äºa对象éé¢ï¼ç¡®ä¿android端å¯ä»¥éè¿webview.loadUrl()æ§è¡åè°ã
ããandroid端åè°js代ç å¦ä¸ï¼
ãã[javascript] view plain copy
ããjavascript:HostApp.callback(0, 0 ,"call back haha");androidæä¾çæ¯ä¸ä¸ªjsæ¹æ³é½å¯¹åºä¸ä¸ªJsCallback对象ï¼androidå°±å¯ä»¥éè¿JsCallback对象æ¥çæ并æ§è¡åè°jsç代ç ã
ããä¸ãä¼ç¼ºç¹
ããa.第ä¸ç§æ¹å¼ä¸å®å ¨ï¼ä¸æ·»å addJavascriptInterface,çè³é»è®¤false,å¨ä½äºAPI17çWebViewä¸é»è®¤æ·»å "SearchBoxJavaBridge_"å°mJavaScriptObjectsä¸ãè¿æ ·å°±æå¯è½éè¿ç¨æ·ä¿¡ä»»ç客æ·ç«¯è·åSDå¡çæ°æ®ï¼b.第ä¸ç§æ¹å¼å¿ é¡»è¦API大äºçäº17æè½ä½¿ç¨
ããc.第ä¸ç§æ¹å¼å½æjsåè°å½æ°éè¦android端æ§è¡æ¶ï¼é½éè¦å°å¿ååè°å½æ°èµå¼ç»å ¨å±å½æ°æè½ä¾android端åè°ï¼å¢å äºjsåandroid端éä¿¡çå°è£ å±çä½æ代ç éï¼è第äºç§æ¹å¼åæ¯éè¿å¨ææ³¨å ¥jsçæ¹å¼åé常æ¹ä¾¿ã
ããd.第äºç§æ¹å¼ä¹æä¸å®éå¶ï¼æ¯å¦androidæä¾çæ¹æ³å¿ é¡»æ¯static修饰çï¼ä¸æ¹æ³ç¬¬ä¸ä¸ªåæ°å¿ 须为WebView,ä¸è¿è¿ä¸å½±å使ç¨ã
温馨提示:答案为网友推荐,仅供参考