
嘻道奇闻
- 文章199742
- 阅读14625734
React Native开发必知:JS与Android原生通信的完整指南
鈥?strong>鈥嬧€滄槑鏄庣敤React Native鍐欏ソ浜嗛〉闈紝涓哄暐杩樿鎶樿吘鍘熺敓浠g爜锛烰S鍜孞ava鍒板簳鎬庝箞闅旂┖瀵硅瘽锛熲€濃€?/strong>鈥?br/> 鍘诲勾鏈変釜鍋氱數鍟嗙殑鏈嬪弸鎵炬垜鏁戞€ワ紝浠栦滑鐨凴eact Native App姝绘椿璋冧笉璧峰畨鍗撴壂鐮佹ā鍧椼€傛姌鑵句袱澶╁悗鍙戠幇锛岄棶棰樺氨鍑哄湪鈥?strong>鈥嬮€氫俊鍗忚娌″榻愨€?/strong>鈥嬨€備粖澶╁挶浠氨鎺板紑鎻夌浜嗚锛屾€庝箞璁㎎S鍜孞ava鍦≧eact Native閲岄『鍒╃壍鎵嬨€?/p>
涓€銆佸師鐢熸ā鍧楀熀纭€璇撅細NativeModules涓夋澘鏂?/h2>
鈥?strong>鈥嬧€滃惉璇磋鍐欎粈涔堝師鐢熸ā鍧楋紝鏄笉鏄緱鍏堝Java锛熲€濃€?/strong>鈥?br/> 鍒厡锛丷eact Native鏃╁氨澶囧ソ浜嗏€?strong>鈥婲ativeModules鈥?/strong>鈥嬭繖鎶婄憺澹啗鍒€銆傚氨绠椾綘Java姘村钩鍋滅暀鍦?Hello World"锛岀収鏍疯兘鐜╄浆鍩虹閫氫俊銆?/p>
鈻嶁€?strong>鈥嬫墜鎶婃墜鍒涘缓绗竴涓ā鍧椻€?/strong>鈥嬶細
- 鏂板缓
CustomModule.java
锛?/li>
java澶嶅埗public class CustomModule extends ReactContextBaseJavaModule { // 蹇呴』鐨勬ā鍧楀悕娉ㄥ唽 @Override public String getName() { return "CustomModule"; } // 鏆撮湶缁橨S鐨勬柟娉?/span> @ReactMethod public void showMessage(String msg) { Toast.makeText(getReactApplicationContext(), msg, Toast.LENGTH_LONG).show(); } }
- 鍒涘缓鍖呯鐞嗗櫒
CustomPackage.java
锛?/li>
java澶嶅埗public class CustomPackage implements ReactPackage { @Override public List
createNativeModules(...) { return Arrays. asList(new CustomModule()); } //...鍏朵粬蹇呰鏂规硶 }
- 鍦∕ainApplication.java娉ㄥ唽锛?/li>
java澶嶅埗@Override protected List
getPackages() { return Arrays.asList( new MainReactPackage(), new CustomPackage() // 娣诲姞鑷畾涔夊寘 ); }
鈥?strong>鈥嬧殸锔?鏂版墜蹇呰俯鐨勫潙鈥?/strong>鈥嬶細
- 蹇樿鍔?code>@ReactMethod娉ㄨВ锛孞S绔娲绘壘涓嶅埌鏂规硶
- 妯″潡鍚嶇敤浜嗙壒娈婂瓧绗︼紝瀵艰嚧JS璋冪敤鏃舵姤undefined
- 娌″鐞嗙嚎绋嬮棶棰橈紝鍦ㄤ富绾跨▼鍋氳€楁椂鎿嶄綔鐩存帴鍗℃
浜屻€佸弻鍚戦€氫俊杩涢樁锛氫簨浠剁洃鍚笌鍥炶皟
鈥?strong>鈥嬧€淛ava澶勭悊瀹屾€庝箞閫氱煡JS锛熸€讳笉鑳藉共绛夌潃鍚э紵鈥濃€?/strong>鈥?br/> 杩欐椂鍊欏氨寰楄鍑衡€?strong>鈥嬩簨浠跺彂灏勫櫒锛圗ventEmitter锛夆€?/strong>鈥嬪拰鈥?strong>鈥嬪洖璋冩満鍒垛€?/strong>鈥嬭繖瀵归粍閲戞惌妗d簡銆?/p>
鈻嶁€?strong>鈥嬫柟妗堝姣旇〃鈥?/strong>鈥嬶細
鏂瑰紡 | 閫傜敤鍦烘櫙 | 浼樼偣 | 缂虹偣 |
---|---|---|---|
浜嬩欢鐩戝惉 | 瀹炴椂鐘舵€佹帹閫侊紙濡侴PS瀹氫綅锛?/td> | 鈥?strong>鈥嬩竴瀵瑰閫氱煡鈥?/strong>鈥嬶紝瑙h€︽€у己 | 闇€瑕佹墜鍔ㄧЩ闄ょ洃鍚?/td> |
Promise鍥炶皟 | 鍗曟寮傛鎿嶄綔锛堝鏂囦欢涓婁紶锛?/td> | 鏀寔async/await璇硶 | 鍙兘瑙﹀彂涓€娆?/td> |
Callback鍥炶皟 | 绠€鍗曠粨鏋滆繑鍥?/td> | 鍐欐硶绠€鍗曠矖鏆?/td> | 瀹规槗浜х敓鍥炶皟鍦扮嫳 |
鈥?strong>鈥嬸煂?瀹炴垬妗堜緥鈥斺€旇幏鍙栬澶囩數閲忊€?/strong>鈥嬶細
java澶嶅埗// Java绔?/span> @ReactMethod public void getBatteryLevel(Promise promise) { try { Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); promise.resolve(level); } catch (Exception e) { promise.reject("BATTERY_ERROR", e); } }
javascript澶嶅埗// JS绔?/span> import { NativeModules } from 'react-native'; NativeModules.CustomModule.getBatteryLevel() .then(level => console.log(`褰撳墠鐢甸噺锛?span>${level}%`)) .catch(err => console.error(err));
涓夈€佺涓夋柟搴撶敓瀛樻寚鍗楋細Bridge vs TurboModules
鈥?strong>鈥嬧€滃惉璇存柊鏋舵瀯瑕佸簾寮冩棫妗ユ帴鏂瑰紡锛熺幇鍦ㄥ杩欎簺浼氫笉浼氳繃鏃讹紵鈥濃€?/strong>鈥?br/> 鍒€曪紒Facebook鎺ㄥ嚭鐨勨€?strong>鈥婽urboModules鈥?/strong>鈥嬬‘瀹炲湪鎬ц兘涓婃湁鎻愬崌锛屼絾鐜版湁椤圭洰杩佺Щ闇€瑕佹椂闂淬€傚挶浠殑绛栫暐鏄細鈥?strong>鈥嬭€侀」鐩敤Bridge淇濈ǔ瀹氾紝鏂板姛鑳藉皾璇昑urboModules鈥?/strong>鈥嬨€?/p>
鈻嶁€?strong>鈥嬩紶缁烞ridge涓嶵urboModules瀵规瘮鈥?/strong>鈥嬶細
- 鈥?strong>鈥嬪垵濮嬪寲鏃舵満鈥?/strong>鈥嬶細Bridge闅忓簲鐢ㄥ惎鍔ㄥ姞杞斤紝TurboModules鎸夐渶鍔犺浇
- 鈥?strong>鈥嬬被鍨嬫敮鎸佲€?/strong>鈥嬶細TurboModules鐩存帴鏀寔
Double
,Float
绛夊鏉傜被鍨?/li> - 鈥?strong>鈥嬫柟娉曡皟鐢ㄢ€?/strong>鈥嬶細TurboModules閲囩敤C++瀹炵幇锛岄€氫俊閫熷害鎻愬崌3鍊?/li>
鈥?strong>鈥嬸煈?杩佺Щ灏忚创澹€?/strong>鈥嬶細
- 鍏堢敤
react-native-codegen
鑷姩鐢熸垚绫诲瀷瀹氫箟 - 閫愭鏇挎崲鍏抽敭妯″潡锛屾瘮濡傞绻佽皟鐢ㄧ殑鏀粯SDK
- 娉ㄦ剰Android绔渶瑕侀厤缃瓹MakeLists.txt
璇寸偣鐪熷疄鐨勯」鐩粡楠?/h2>
鍘诲勾鎺ユ墜杩囦竴涓棩娲?0涓囩殑璺ㄥ鐢靛晢App锛屼粬浠殑React Native椤甸潰璋冪敤鍘熺敓鐩告満缁忓父OOM宕╂簝銆傛渶鍚庡彂鐜版槸JS绔绻佸彂閫乥ase64鍥剧墖鏁版嵁锛屾妸閫氫俊閫氶亾鍫垫浜嗐€傛敼鎴愨€?strong>鈥嬪師鐢熷帇缂╁悗鍐嶄紶鏂囦欢璺緞鈥?/strong>鈥嬶紝宕╂簝鐜囩洿鎺ラ檷浜?0%銆?/p>
鐜板湪鐪嬪埌鏂颁汉鍔ㄤ笉鍔ㄥ氨鍏ㄩ噺浼犺緭鏁版嵁锛岀湡鎯冲惣涓€鍡撳瓙锛氣€?strong>鈥嬧€滈€氫俊涓嶆槸浼犳儏涔︼紝鍒暐閮藉線閲屽锛佲€濃€?/strong>鈥?璁颁綇涓変釜鍘熷垯锛?/p>
- 鑳界敤绠€鍗曠被鍨嬪氨鍒敤澶嶆潅瀵硅薄
- 鑳藉紓姝ュ氨鍒悓姝?/li>
- 鑳藉皯浼犱竴涓瓧鑺傞兘鏄儨鍒?/li>
鏈€鍚庨€佸ぇ瀹朵竴鍙ヨ瘽锛氣€?strong>鈥嬫妧鏈€夊瀷鐪嬪満鏅紝閫氫俊璁捐閲嶈妭鍒垛€?/strong>鈥嬨€傛妸杩欎笁鏉挎枾缁冪啛浜嗭紝涓嬫閬囧埌鈥淩N璋冪敤鍘熺敓钃濈墮鎵撳嵃鈥濊繖绉嶉渶姹傦紝浣犲氨鑳芥贰瀹氬湴璇达細鈥滃皬case锛岀粰鎴戝崐灏忔椂锛佲€?/p>