《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」

本书详细解析ReactNative与Android平台的混合开发原理,包括原生功能实现、模块注册及包定义,通过实例代码帮助读者深入理解通信机制。

此文是我的出版书籍《React Native 精解与实战》连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理、React Native 组件布局、组件与 API 的介绍与代码实战,以及 React Native 与 iOS、Android 平台的混合开发底层原理讲解与代码实战演示,精选了大量实例代码,方便读者快速学习。

书籍配套视频教程「80 节实战课精通 React Native 开发」:此视频课程建议配合书籍学习,书籍中原理性的东西讲解的比较清晰,而视频教程对于组件、API 等部分的代码实战开发讲解比较直观。

书籍所有相关资料请访问:http://rn.parryqiu.com

本章继续介绍 Android 平台下的混合开发原理以及实战,同时我们还可以深入理解React Native 与 Android 平台的通信机制。

12.1 Android 平台混合开发简介

与 iOS 平台的混合开发一样,有时我们遇到 React Native 框架没有提供的原生 Android 平台 API 时,我们就需要自己来进行 React Native 平台与 Android 平台的混合开发。
同样,混合开发还可以利用起来现有的 Android 原生平台的代码,并可以用于开发一些高性能、多线程的需求场景。

React Native 框架的设计同样为 Android 原生平台提供了混合开发的可能性,这部分依然属于 React Native 开发高阶的部分,在开发前需要掌握了 Android 原生平台的开发语言及开发流程,不过不了解的话也可以学习一下,了解 React Native 平台与 Android 平台的通信原理。

学习的方法我们还是在原理讲解的时候结合一个实际的小实例结合代码进行讲解,而不是仅仅空洞地讲解概念性的东西,便于大家理解。最后我们还将完成一个更加贴近实际的小实例,来加深 React Native 框架与 Android 平台混合开发的理解与运用。

12.2 Android 平台混合开发原理详解

我们按照学习 iOS 平台混合开发的模式,这里我们继续结合一个小的实例来学习 React Native 平台与 Android 平台混合开发的原理与方法。

Android 平台的混合开发主要包含如下几个主要步骤:
1) 在 Android 项目中通过原生代码实现提供给 React Native 调用的原生功能;
2) 在 Android 项目中将编写好的功能模块进行注册;
3) 定义功能模块的 Android 包;
4) 在 React Native 项目中通过 JavaScript 代码调用混合开发实现的 Android 平台原生功能。

完整代码在本书配套源码的 12-02 文件夹。

12.2.1 Android 原生代码实现

先通过 React Native CLI 初始化一个空项目,项目名称为 NativeAndroidModule,项目初始化的流程如图 12-1 所示。

截图
图 12-1 Android 混合开发项目初始化

使用 Android 平台的开发工具 Android Studio 打开项目文件夹中的 android 文件夹,在 Android Studio 中选择导入此文件夹即可,如图 12-2 所示。

截图
图 12-2 Android Studio 导入项目

注意,如果你是第一次打开此项目文件夹,Android Studio 会自动下载 Gradle 并使用 Gradle 进行项目的构建,此过程要确保你的网络环境没有任何阻碍并需要耐心等待加载完毕,加载过程如图 12-3 所示。

截图
图 12-3 Gradle 初始化并进行项目的构建

项目使用 Android Studio 导入后打开如图 12-4 所示。

截图
图 12-4 Android Studio 打开项目后的项目结构

新建的 Android 原生平台的类需要继承于React Native 框架提供的父类 ReactContextBaseJavaModule,这里我们新建的类命名为 MyModule。

如果没有导入 ReactContextBaseJavaModule 的包,Android Studio 会提示你进行包的引入,如图 12-5 所示。

截图
图 12-5 Android Studio 提示导入缺失的包

新建后的文件代码如下所示。

1. import com.facebook.react.bridge.ReactContextBaseJavaModule;  
2. 
3. public class MyModule extends ReactContextBaseJavaModule {  
4. 
5. }  

在继承了 ReactContextBaseJavaModule 父类后,需要实现方法 getName 返回模块名称,并在添加了类的构造函数,以及实现了调用 Android 原生 API 保持屏幕常亮并关闭常亮的两个方法 keepScreenAwake 和 removeScreenAwake。完整的 MyModule.java 代码如下。

1.  package com.nativeandroidmodule;  
2.    
3.  import com.facebook.react.bridge.ReactApplicationContext;  
4.  import com.facebook.react.bridge.ReactContextBaseJavaModule;  
5.  import com.facebook.react.bridge.ReactMethod;  
6.    
7.  public class MyModule extends ReactContextBaseJavaModule {  
8.    
9.      ReactApplicationContext reactContext;  
10.   
11.     public MyModule(ReactApplicationContext reactContext) {  
12.         super(reactContext);  
13.         this.reactContext = reactContext;  
14.     }  
15.   
16.     @Override  
17.     public String getName() {  
18.         return "MyModule";  
19.     }  
20.   
21.     @ReactMethod  
22.     public void keepScreenAwake() {  
23.         getCurrentActivity().runOnUiThread(new Runnable() {  
24.             @Override  
25.             public void run() {  
26.                 getCurrentActivity().getWindow().addFlags(  
27.                         android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
28.             }  
29.         });  
30.     }  
31.   
32.     @ReactMethod  
33.     public void removeScreenAwake() {  
34.         getCurrentActivity().runOnUiThread(new Runnable() {  
35.             @Override  
36.             public void run() {  
37.                 getCurrentActivity().getWindow().clearFlags(  
38.                         android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
39.             }  
40.         });  
41.     }  
42. }  

同样,其他的 Android 平台的原生方法都可以按照此形式进行添加,添加后即可在 React Native 的 JavaScript 代码中调用。

12.2.2 Android 原生模块注册

接下来我们需要创建一个类来实现 ReactPackage 的接口函数,实现原生模块的注册,这里我们命名此文件名为 MyModulePackage.java,并实现接口中的 createNativeModules 与createViewManagers 两个方法。这里我们使用函数 createNativeModules 来进行模块的注册,另一个函数 createViewManagers 进行空值返回即可。

最终的完整代码如下,注意代码第 19 行的定义。

1.  package com.nativeandroidmodule;  
2.    
3.  import com.facebook.react.ReactPackage;  
4.  import com.facebook.react.bridge.NativeModule;  
5.  import com.facebook.react.bridge.ReactApplicationContext;  
6.  import com.facebook.react.uimanager.ViewManager;  
7.    
8.  import java.util.ArrayList;  
9.  import java.util.Collections;  
10. import java.util.List;  
11.   
12. public class MyModulePackage implements ReactPackage {  
13.     @Override  
14.     public List<NativeModule> createNativeModules(  
15.             ReactApplicationContext reactContext) {  
16.         List<NativeModule> modules = new ArrayList<>();  
17.   
18.         modules.add(new  
19.                 MyModule(reactContext));  
20.   
21.         return modules;  
22.     }  
23.   
24.     @Override  
25.     public List<ViewManager> createViewManagers(ReactApplicationContext  
26.                                                         reactContext) {  
27.         return Collections.emptyList();  
28.     }  
29. }  

12.2.3 Android 包定义

在项目中的 MainApplication.java 文件中,需要包含上我们自己开发的原生包,添加在 getPackages 函数中即可。

1.  package com.nativeandroidmodule;  
2.    
3.  import android.app.Application;  
4.    
5.  import com.facebook.react.ReactApplication;  
6.  import com.facebook.react.ReactNativeHost;  
7.  import com.facebook.react.ReactPackage;  
8.  import com.facebook.react.shell.MainReactPackage;  
9.  import com.facebook.soloader.SoLoader;  
10.   
11. import java.util.Arrays;  
12. import java.util.List;  
13.   
14. public class MainApplication extends Application implements ReactApplication {  
15.   
16.   private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {  
17.     @Override  
18.     public boolean getUseDeveloperSupport() {  
19.       return BuildConfig.DEBUG;  
20.     }  
21.   
22.     @Override  
23.     protected List<ReactPackage> getPackages() {  
24.       return Arrays.<ReactPackage>asList(  
25.           new MainReactPackage(),  
26.               //包含上我们自定义的原生组件包  
27.               new MyModulePackage()  
28.       );  
29.     }  
30.   
31.     @Override  
32.     protected String getJSMainModuleName() {  
33.       return "index";  
34.     }  
35.   };  
36.   
37.   @Override  
38.   public ReactNativeHost getReactNativeHost() {  
39.     return mReactNativeHost;  
40.   }  
41.   
42.   @Override  
43.   public void onCreate() {  
44.     super.onCreate();  
45.     SoLoader.init(this, /* native exopackage */ false);  
46.   }  
47. }  

包含的方式在代码的第 27 行,Android 原生端开发完毕后的文件结构如图 12-6 所示。

截图
图 12-6 Android 端开发完毕文件结构

【语音分离】基于平均谐波结构建模的无监督单声道音乐声源分离(Matlab代码实现)内容概要:本文介绍了基于平均谐波结构建模的无监督单声道音乐声源分离方法,并提供了相应的Matlab代码实现。该方法通过对音乐信号中的谐波结构进行建模,利用音源间的频率特征差异,实现对混合音频中不同乐器或人声成分的有效分离。整个过程无需标注数据,属于无监督学习范畴,适用于单通道录音场景下的语音音乐分离任务。文中强调了算法的可复现性,并附带完整的仿真资源链接,便于读者学习验证。; 适合人群:具备一定信号处理基础和Matlab编程能力的高校学生、科研人员及从事音频处理、语音识别等相关领域的工程师;尤其适合希望深入理声源分离原理并进行算法仿真实践的研究者。; 使用场景及目标:①用于音乐音频中人声伴奏的分离,或不同乐器之间的分离;②支持无监督条件下的语音处理研究,推动盲源分离技术的发展;③作为学术论文复现、课程项目开发或科研原型验证的技术参考。; 阅读建议:建议读者结合提供的Matlab代码网盘资料同步运行调试,重点关注谐波建模频谱分的实现细节,同时可扩展学习盲源分离中的其他方法如独立成分分析(ICA)或非负矩阵分(NMF),以加深对音频信号分离机制的理
内容概要:本文系统介绍了新能源汽车领域智能底盘技术的发展背景、演进历程、核心技术架构及创新形态。文章指出智能底盘作为智能汽车的核心执行层,通过线控化(X-By-Wire)和域控化实现驱动、制动、转向、悬架的准主动控制,支撑高阶智能驾驶落地。技术发展历经机械、机电混合到智能三个阶段,当前以线控转向、线控制动、域控制器等为核心,并辅以传感器、车规级芯片、功能安全等配套技术。文中还重点探讨了“智能滑板底盘”这一创新形态,强调其高度集成化、模块化优势及其在成本、灵活性、空间利用等方面的潜力。最后通过“2025智能底盘先锋计划”的实车测试案例,展示了智能底盘在真实场景中的安全性能表现,推动技术从研发走向市场验证。; 适合人群:汽车电子工程师、智能汽车研发人员、新能源汽车领域技术人员及对智能底盘技术感兴趣的从业者;具备一定汽车工程或控制系统基础知识的专业人士。; 使用场景及目标:①深入了智能底盘的技术演进路径系统架构;②掌握线控技术、域控制器、滑板底盘等关键技术原理应用场景;③为智能汽车底盘研发、系统集成技术创新提供理论支持实践参考。; 阅读建议:建议结合实际车型和技术标准进行延伸学习,关注政策导向行业测试动态,注重理论实车验证相结合,全面理智能底盘从技术构想到商业化落地的全过程。
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全性鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码案例进行实践操作,重点关注双层优化结构场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevOpenClub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值