Android原生接入React Native

一、新建一个Android Studio项目

二、在项目根目录下创建一个名为package.json的空文本文件,然后填入以下内容:
    在这里插入图片描述
    字段name,version均可自定义,scripts中是用于启动 packager 服务的命令。

三、使用 yarn 或 npm(两者都是 node 的包管理器)来安装 React 和 React Native 模块
   打开 AS的Terminal终端,输入如下命令:
   在这里插入图片描述
   运行成功后会在项目根目录生成一个”node_modules”文件夹(JavaScript 依赖模块)
   node_modules要记录到.gitignore文件中(即不上传到版本控制系统,只保留在本地)
   这样默认会安装最新版本的 React Native,同时会打印出类似下面的警告信息(你可能需要滚   动屏幕才能注意到):
   在这里插入图片描述
   这是正常现象,意味着我们还需要安装指定版本的 React,必须严格匹配警告信息中所列出的版   本,高了或者低了都不可以。如果有多处类似警告必须一一安装。比如上图警告信息,安装命令为:

yarn add react@16.2.0

四、配置maven
1、在你的 app 中 build.gradle 文件中添加 React Native 依赖:

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

2、在项目的根目录的 build.gradle 文件中为 React Native 添加一个 maven 依赖的入口,必须 写在 “allprojects” 代码块中,配置如下图:
在这里插入图片描述
3、在app中的build.gradle配置Hermes,不然运行后会报找不到libhermers.so异常,具体配置见下图红线框出部分
在这里插入图片描述
五、配置权限
在 AndroidManifest.xml 清单文件中声明网络权限,如果大于6.0,还需要配置悬浮窗权限:

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

如果是真机调试,可添加配置(通过摇晃手机调出Debug菜单)

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

六、在根目录创建一个index.js文件(在 0.49 版本之前是 index.android.js 文件)
在index.js文件中添加显示Hello,world代码

import React from 'react';
import {AppRegistry, StyleSheet, Text, View} from 'react-native';

class HelloWorld extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.hello}>Hello,LiYan World</Text>
      </View>
    );
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  },
  hello: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

AppRegistry.registerComponent('MyReactNativeApp', () => HelloWorld);

七、创建实现ReactApplication接口的Application

public class MyApplication extends Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(new MainReactPackage());
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this,false);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
    }
}

八、创建一个空白Activity并实现DefaultHardwareBackBtnHandler接口,在Activity中创建一个ReactRootView 对象,作为承载JS的对象

public class SeconActivity extends Activity implements DefaultHardwareBackBtnHandler {

    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mReactRootView = new ReactRootView(this);
        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setCurrentActivity(this)
                .setBundleAssetName("index.android.bundle")
                .setJSMainModulePath("index")        //传入参数为js文件路径+js文件名
                .addPackage(new MainReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        // 注意这里的MyReactNativeApp必须对应“index.js”中的
        // “AppRegistry.registerComponent()”的第一个参数
        mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null);

        setContentView(mReactRootView);
    }

    @Override
    public void invokeDefaultOnBackPressed() {
        super.onBackPressed();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy(this);
        }
        if (mReactRootView != null) {
            mReactRootView.unmountReactApplication();
        }
    }

    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
            mReactInstanceManager.showDevOptionsDialog();
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

}

九、启动react服务
1.(此步骤为在Linux系统中碰见的问题,Windows请忽略此步骤)在启动react服务之前,需要更改watchman监听文件数量配置,不然会因为watchman监听数 量不足导致启动服务失败,可通过如下命令永久修改watchman配置(Terminal中执行即可):

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
echo fs.inotify.max_user_instances=524288 | sudo tee -a /etc/sysctl.conf
echo fs.inotify.max_queued_events=524288 | sudo tee -a /etc/sysctl.conf

通过sudo sysctl -p命令查看配置是否成功,然后执行

watchman shutdown-server

2.执行yarn start命令启动服务,如下图所示即为启动成功
在这里插入图片描述
3.然后运行AS项目到模拟器或手机查看效果,建议使用模拟器,如果是真机,则必须确保手机和电脑在同一网段内,不然连不上PC上启动的服务

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值