移动混合开发:Web端JS调用Java接口的最佳实践解析
鈥?strong>鈥嬧€滅綉椤典笂鐨勪竴涓寜閽紝鍜嬪氨鑳芥墦寮€鎵嬫満鎽勫儚澶达紵H5椤甸潰鍑粈涔堣皟鐢ㄥ師鐢熷姛鑳斤紵鈥濃€?/strong>鈥?br/> 鍘诲勾甯湅鍙嬪叕鍙告晳鐏紝浠栦滑鐢ㄦ贩鍚堝紑鍙戝仛鐨勬斂鍔pp鍑轰簡澶ч棶棰樷€斺€斿競姘戜笂浼犺韩浠借瘉鐓х墖鏃讹紝瀹夊崜鏈哄崄娆℃湁涓夋闂€€銆傛煡鍒版渶鍚庡彂鐜帮紝灞呯劧鏄€?strong>鈥婮S璋冪敤Java鎺ュ彛鏃舵病澶勭悊濂藉浘鐗囧帇缂┾€?/strong>鈥嬶紒浠婂ぉ鍜变滑灏辨幇寮€鎻夌浜嗚亰锛屾€庝箞璁¦eb鍜屽師鐢熺椤虹晠瀵硅瘽銆?/p>
涓€銆佸熀纭€涓夋澘鏂э細閫夊閫氫俊濮垮娍寰堥噸瑕?/h2>
鈥?strong>鈥嬧€滃惉璇存湁涓冨叓绉嶈皟鐢ㄦ柟寮忥紝鏂版墜璇ョ敤鍝釜锛熲€濃€?/strong>鈥?br/> 鍒厡锛佽浣忚繖涓変釜鏈€绋冲綋鐨勫璺紝鑳借В鍐?0%鐨勯渶姹傦細
鈻嶁€?strong>鈥嬫柟妗堝姣旇〃鈥?/strong>鈥嬶紙寤鸿鏀惰棌锛夛細
鏂规硶 | 閫傜敤鍦烘櫙 | 浼樼偣 | 鍧戠偣棰勮 |
---|---|---|---|
@JavascriptInterface | 绠€鍗曟暟鎹紶閫?/td> | 鈥?strong>鈥嬪畼鏂硅璇佹渶瀹夊叏鈥?/strong>鈥?/td> | 瀹夊崜4.2+蹇呴』鍔犳敞瑙?/td> |
URL Scheme鎷︽埅 | 澶嶆潅鍙傛暟浼犻€?/td> | 鏀寔JSON绛夌粨鏋勫寲鏁版嵁 | 闇€瑕佽嚜宸辫璁″崗璁牸寮?/td> |
WebView鎺у埗鍙?/td> | 璋冭瘯鍦烘櫙 | 涓嶇敤鏀逛唬鐮佸揩閫熼獙璇?/td> | 缁濆绂佹涓婄敓浜х幆澧冿紒 |
鈥?strong>鈥嬸煂?涓句釜鐪熷疄妗堜緥鈥?/strong>鈥嬶細
鏀垮姟App閲屾湁涓€愭壂鐮佺櫥褰曘€戝姛鑳斤紝Web椤甸潰鐐规寜閽敜璧峰師鐢熸壂鐮併€?br/>
鐢║RL Scheme鏂规鐨勮瘽锛?/p>
- JS绔彂鎸囦护锛?code>window.location.href='govapp://scan?type=qr&callback=scanResult'
- Java绔嫤鎴В鏋愶紝鎵畬鍥炰紶鏁版嵁锛?/li>
java澶嶅埗webView.loadUrl("javascript:scanResult('"+result+"')");
浜屻€佸弬鏁颁紶閫掔敓瀛樻寚鍗楋細鍒鏁版嵁鍙樻潃鎵?/h2>
鈥?strong>鈥嬧€滀负浠€涔堜紶涓浘鐗囩粡甯窸OM宕╂簝锛熲€濃€?/strong>鈥?br/> 瑙佽繃澶浜虹洿鎺ユ妸base64濉炵粰Java绔紝4MB鐨勫浘鐗囧彉8MB瀛楃涓诧紝鍐呭瓨涓嶇偢鎵嶆€紒璁颁綇杩欎笁涓繚鍛藉師鍒欙細
- 鈥?strong>鈥嬭兘浼犺矾寰勫氨鍒紶鏁版嵁鈥?/strong>鈥嬶細
javascript澶嶅埗// 閿欒绀鸿寖 鉂?/span> AndroidBridge.uploadImage(base64Str); // 姝g‘濮垮娍 鉁? AndroidBridge.getImagePath().then(path => { // Java绔繑鍥炴湰鍦版枃浠惰矾寰勫啀澶勭悊 });
- 鈥?strong>鈥嬫暟瀛楃被鍨嬭杞崲鈥?/strong>鈥嬶細
JS閲岀殑Number鍙兘鏄痙ouble锛孞ava绔敤int鎺ユ敹鐩存帴宕╂簝銆傝寰楀湪Java渚у仛绫诲瀷鏍¢獙锛?/li>
java澶嶅埗@JavascriptInterface public void setFontSize(Object size) { int fontSize = (size instanceof Double) ? ((Double)size).intValue() : 16; }
- 鈥?strong>鈥嬫棩鏈熸牸寮忕粺涓€鏃跺尯鈥?/strong>鈥嬶細
閬囧埌杩囪法鏃跺尯鐢ㄦ埛浼犲弬閿欒鍚楋紵寮哄埗绾﹀畾鐢║TC鏃堕棿鎴筹細
javascript澶嶅埗// JS绔?/span> const timestamp = new Date().getTime(); AndroidBridge.setDeadline(timestamp);
涓夈€佸紓甯稿鐞嗛粦绉戞妧锛氳Crash鏃犲鍙€?/h2>
鈥?strong>鈥嬧€滀负浠€涔堟祴璇曞ソ濂界殑锛屼笂绾垮氨闂€€锛熲€濃€?/strong>鈥?br/> 娣峰悎寮€鍙戠殑宕╂簝80%鍑哄湪閫氫俊鐜妭銆傚垎浜嚑涓疄鎴橀獙璇佽繃鐨勯槻宕╂妧宸э細
鈻嶁€?strong>鈥嬮槻寰℃€х紪绋嬩笁浠跺鈥?/strong>鈥嬶細
- 鎺ュ彛鍏煎鎬у垽鏂細
javascript澶嶅埗// 鍏堟娴嬫槸鍚﹀瓨鍦ㄥ啀璋冪敤 if(window.AndroidBridge?.getLocation) { AndroidBridge.getLocation(); } else { // 闄嶇骇鍒癏5瀹氫綅 }
- 鍙屽悜蹇冭烦妫€娴嬶細
Java绔瘡30绉掔粰JS鍙戜釜鏃堕棿鎴筹紝JS鏀跺埌鍚庡洖浼犮€傝秴杩?娆℃病鍝嶅簲灏卞脊绐楁彁绀猴細
java澶嶅埗// Java瀹氭椂浠诲姟 handler.postDelayed(() -> { webView.loadUrl("javascript:heartbeat('"+System.currentTimeMillis()+"')"); }, 30000);
- 閿欒杈圭晫鎷︽埅锛堝畨鍗撶壒鏈夛級锛?br/> 閲嶅啓WebViewClient鎹曡幏JS閿欒锛?/li>
java澶嶅埗webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // 鎶奐S閿欒杞彂鍒癗ative鐩戞帶骞冲彴 } });
鍥涖€佹€ц兘浼樺寲楠氭搷浣滐細娴佺晠寰楀儚寰疯姍
鈥?strong>鈥嬧€滀负浠€涔堣皟鐢ㄦ帴鍙e悗椤甸潰鍙樺崱锛熲€濃€?/strong>鈥?br/> 鍘诲勾浼樺寲杩囦竴涓ぞ鍖篈pp锛孞S璋冨師鐢熺浉鍐屾椂锛宨OS涓濊埇椤烘粦锛屽畨鍗撳嵈鍗℃垚PPT銆傚悗鏉ュ彂鐜版槸鈥?strong>鈥嬮绻佽法绾跨▼閫氫俊鎯圭殑绁糕€?/strong>鈥嬨€傝浣忚繖涓や釜浼樺寲澶ф嫑锛?/p>
- 鈥?strong>鈥嬫壒閲忓鐞嗙瓥鐣モ€?/strong>鈥嬶細
鍒儚鎸ょ墮鑶忎竴鏍烽绻佽皟鎺ュ彛锛佹妸澶氫釜鎿嶄綔鎵撳寘澶勭悊锛?/li>
javascript澶嶅埗// 鍘熷璋冪敤 鉂?/span> AndroidBridge.setTitle('棣栭〉'); AndroidBridge.setTheme('blue'); AndroidBridge.setFontSize(16); // 浼樺寲鐗?鉁? AndroidBridge.batchUpdate({ title: '棣栭〉', theme: 'blue', fontSize: 16 });
- 鈥?strong>鈥嬩簩杩涘埗鏁版嵁璧伴€氶亾鈥?/strong>鈥嬶細
闇€瑕佷紶杈撳浘鐗?鏂囦欢鏃讹紝鐢˙lob浠f浛base64锛?/li>
java澶嶅埗// Java绔?/span> @JavascriptInterface public void uploadBlob(String blobData) { byte[] bytes = Base64.decode(blobData.split(",")[1], Base64.DEFAULT); // 鐩存帴鎿嶄綔瀛楄妭鏁扮粍 }
璇寸偣寰楃姜浜虹殑澶у疄璇?/h2>
骞蹭簡浜斿勾娣峰悎寮€鍙戯紝瑙佽繃澶鍥㈤槦鍦ㄨ繖鏍借窡澶淬€備笂涓湀鏈変釜鍒涗笟鍏徃鑰佹澘璺熸垜璇夎嫤锛岃鑺变簡20涓囧仛鐨凙pp鐢ㄤ笁涓湀灏卞純鍧戯紝鏍规湰鍘熷洜灏辨槸鈥?strong>鈥婮S鍜孞ava閫氫俊璁捐澶鏀锯€?/strong>鈥嬨€傚垎浜笁涓娉暀璁細
-
鈥?strong>鈥嬪埆鐩镐俊鍓嶇浼犵殑浠讳綍鍙傛暟鈥?/strong>鈥嬶紒鏇剧粡鏈塇5椤甸潰浼犱簡涓?null"瀛楃涓诧紝瀵艰嚧Java绔В鏋怞SON鏃剁洿鎺ュ穿婧冦€傜幇鍦ㄦ墍鏈夋帴鍙i兘寮哄埗鍋氱被鍨嬫牎楠屻€?/p>
-
鈥?strong>鈥嬬増鏈吋瀹硅鍐欏湪DNA閲屸€?/strong>鈥嬨€傚幓骞存煇涓畨鍗撶郴缁熷崌绾э紝瀵艰嚧@JavascriptInterface澶辨晥锛屽叏鍏徃閫氬鏀逛唬鐮併€傜幇鍦ㄦ墍鏈夐」鐩兘鍔犱袱濂楅€氫俊鏂规鍋氬鐢ㄣ€?/p>
-
鈥?strong>鈥嬬洃鎺ф瘮鍔熻兘鏇撮噸瑕佲€?/strong>鈥嬨€傛垜浠湪閫氫俊灞傚煁浜?7涓煁鐐癸紝鑳藉疄鏃剁湅鍒版帴鍙h皟鐢ㄦ垚鍔熺巼銆傛浘缁忛潬杩欎釜鎻愬墠鍙戠幇鏌愭満鍨嬪吋瀹规€ч棶棰橈紝閬垮厤浜嗗ぇ闈㈢Н瀹㈣瘔銆?/p>
鏈€鍚庤鍙ユ帍蹇冪獫瀛愮殑璇濓細鈥?strong>鈥嬫贩鍚堝紑鍙戜笉鏄竾鑳借兌锛岀敤瀵逛簡鍦版柟鑳界渷50%鎴愭湰锛岀敤閿欎簡灏辨槸鏃犲簳娣卞潙鈥?/strong>鈥嬨€備笅娆′骇鍝佺粡鐞嗗啀鎻愨€淗5椤甸潰瑕佽皟鐢ㄥ師鐢熶汉鑴歌瘑鍒€濇椂锛岃寰楀厛缈诲嚭杩欑瘒鏂囩珷鎷嶄粬妗屼笂锛?/p>