此文是我的出版书籍《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 端开发完毕文件结构

《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」的更多相关文章

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

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  2. 《React Native 精解与实战》书籍连载「配置 iOS 与 Android 开发环境」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  3. 《React Native 精解与实战》书籍连载「React Native 网络请求与列表绑定」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  4. 《React Native 精解与实战》书籍连载「React Native 中的生命周期」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  5. 《React Native 精解与实战》书籍连载「React Native 底层原理」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  6. 《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  7. 《React Native 精解与实战》书籍连载「React 与 React Native 简介」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  8. [书籍精读]《React Native精解与实战》精读笔记分享

    写在前面 书籍介绍:本书由架构师撰写,包含ReactNative框架底层原理,以及与iOS.Android混合开发案例,精选了大量实例代码,方便读者快速学习.主要内容分为两大部分,第1部分" ...

  9. 《React Native 精解与实战》书籍连载「React Native 源码学习方法及其他资源」

    此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React Native 源码学习方法及其他资源. 最后的章节给大家介绍 React Native ...

随机推荐

  1. [Luogu4705] 玩游戏

    Description 给定两个长度分别为 \(n\) 和 \(m\) 的序列 \(a\) 和 \(b\).要从这两个序列中分别随机一个数,设为 \(a_x,b_y\),定义该次游戏的 \(k\) 次 ...

  2. Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系

    这篇博文是临时增加出来的内容,主要是由于最近连载<Spring Cloud Alibaba基础教程>系列的时候,碰到读者咨询的大量问题中存在一个比较普遍的问题:版本的选择.其实这类问题,在 ...

  3. Aooms_微服务基础开发平台实战_001_开篇

    一.引子 “ 微服务”近年来很火的一个词,如今的热度不亚于当年的SSH组合,各种开发框架.中间件.容器.概念层出不穷. 比如:dubbo.motan.zookeeper.springboot.spri ...

  4. 常用API。

    object类: 1.equals方法: public boolean equals (Object obj) , 指示其他某个对象是否与此对象“相等” 源码:public boolean equal ...

  5. MTF测试图卡规格

    1.Imatest Chart Finder计算图卡大小 测试camera MTF时,需要知道所需要的图卡的大小,Imatest提供了一个网页,只要输入sensor的像素, 镜头的视场角,还有镜头到图 ...

  6. Java开发笔记(五十九)Java8之后的扩展接口

    前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...

  7. ES5新增

    forEach // forEach 返回undefined var arr = ['Prosper', 'Lee', 'is', ['very', 'very'], 'nice', '!', , n ...

  8. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!

    SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空! 如下预留, 批次号字段为空. 实际上该物料是有激活batch management的, For MB21, it is just ...

  9. 通过Arcpy在ArcMap工具箱中添加脚本计算面图层的起终点坐标

    关键词: Arcpy,ArcMap Toolbox, Coordinates of Polygon 需求分析: Arcmap中添加有三个图层:图层“GY乡级河道”(面图层)是全县13个乡镇全部的乡级河 ...

  10. 轨迹系列5——验证轨迹GPS坐标转换为本地坐标的四/七参数是否准确的一种方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 目前对多个项目轨迹不准确的情况做了排查,发现导致轨迹偏移百分 ...