已有Android项目集成RN

开篇一张图,后面全靠编


1.配置ReactNative的js环境

在Android项目根目录下输入命令npm init (直接在Android studio的terminal命令窗口就行)

  我们可以看到init让你生成一个package.json文件,根据实际情况填写的配置参数(也可以从已有的RN项目中拷贝package.json放大Android

  项目根目录下) 

当前最新rn是0.56,但是运行时有报错,建议使用0.55.4

  如果是命令生成的package.json还需要手动添加启动命令,接下来还需要把启动脚本放进去

      "scripts": {

               "start": "node node_modules/react-native/local-cli/cli.js start",

               "test": "jest"

       },

这样我们就可以时时的调用本地调试服务进行热加载

2.添加ReactNative

接下来我们将React、ReactNative添加到项目中:

npm install --save react react-native

完成后会在Android项目中多出一个node_modules文件夹,里面存放了下载好的React 和React Native和根据package.json生成的一些配置(也可以从已有的RN项目中拷贝,但不建议)

3.安装完成之后,我们再去配置.flowconfig,这个是对js代码做约束的,建议配置(也可以不配置)。

curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig

4.添加ReactNative依赖到Android项目

在app的build.gradle引入以下依赖

api "com.facebook.react:react-native:+"

在项目根目录build.gradle添加依赖仓库地址

allprojects {

 repositories {       

    …   

         maven { 

                      // All of React Native (JS, Android binaries) is installed from npm 

                     url "$rootDir/node_modules/react-native/android"     

           } 

    } 

}

这里maven路径官网上写的是rootDir/../nodemodules/react−native/android,而我们为了方便AS编译,直接放在项目根目录配置RN的,所以这里的路径要改成上面这样

为了防止findbugsbug问题,建议在app/build.gradle中增加下面的代码:

android {

    //...

    configurations.all {

        resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.0'

    }

}

5.添加权限

<uses-permission android:name="android.permission.INTERNET"/>

/**设置调试 的权限**/

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

添加debug模式Activity(正式打包注释掉就好了)

<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>

6.添加ReactNative界面

首先我们在Android项目根目录添加index.android.js,这个文件作为RN的入口文件。

(也可以是其他名称,需要在实现ReactApplication接口时重写getJSMainModuleName和getBundleAssetName)

7.添加RN Activity界面

(1).在较老的RN版本中,我们新建一个Activity实现DefaultHardwareBackBtnHandler接口

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mReactRootView = new ReactRootView(this);

        mReactInstanceManager = ReactInstanceManager.builder()

                .setApplication(getApplication())

                .setBundleAssetName("index.android.bundle")

                .setJSMainModuleName("index.android")//对应index.android.js

                .addPackage(new MainReactPackage())

                .setUseDeveloperSupport(BuildConfig.DEBUG)

                .setInitialLifecycleState(LifecycleState.RESUMED)

                .build();

        // 注意这里的HelloWorld必须对应“index.android.js”中的

        // “AppRegistry.registerComponent()”的第一个参数

        mReactRootView.startReactApplication(mReactInstanceManager, "ReactNativeDemo", null);

        setContentView(mReactRootView);

    }

(2).较新的RN版本,例如RN0.55 我们直接继承ReactActivity即可

public class ReactNativeDemoActivity extends ReactActivity{

private static final String MAIN_COMPONENT = "ReactNativeDemo";

/** * 返回在index.android.js 中注册的组件名

* @return

*/ @Nullable

@Override

protected String getMainComponentName() {

        return MAIN_COMPONENT;

    }

}

在原生界面上添加一个入口跳转到ReactNativeDemoActivity即可

  实现DefaultHardwareBackBtnHandler接口的方式,可以局部添加RN的组件mAndroidLayout.addView(mReactRootView);

8.自定义的Application实现ReactApplication接口

public class MainApplication extends Application implements ReactApplication {

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {

                @Override

                protected boolean getUseDeveloperSupport() {

                            return BuildConfig.DEBUG;

                }

        @Override protected List getPackages() {

                return Arrays.<ReactPackage>asList( new MainReactPackage());

        }

};

    @Override

    public ReactNativeHost getReactNativeHost() {

            return mReactNativeHost;

        }

}

9.最后不要忘了在AndroidManifest中添加:

注意需要AppCompat的主题

<activity

  android:name=".ReactNativeDemoActivity"

  android:theme="@style/Theme.AppCompat.Light.NoActionBar"

/>

10.运行项目

1)debug模式,可以不打离线包,实时看到js修改后的效果

    先启动服务 npm start

    然后直接运行Android项目(注意在RN设置界面绑定电脑的ip端口)

2)release模式

    在你打包你的发布版本之前要创建一个bundle文件,这个bundle文件会创建在项目的assets目录中,并且这个文件会包含在你的apk包中,

    在你的项目根目录中运行:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/

index.android.js是刚创建的RN界面入口js的名称,后面的输出目录根据自己项目对应修改,例如在项目根目录新建一个bundle目录存放bundle文件,命令就是这样了:

react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --dev false

下一篇讲解 客户端如何更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容