ReactNative 调用Android 原生(一)——原生模块(一)

前言

React native调用Android原生主要2种方式:
1、调用原生模块
2、调用原生组件

这里之所以强调有2种方式主要是自己刚开始弄rn调原生的时候感觉很懵,感觉没有学习的方向,所以提醒一下大家咱们的学习目标。
官网也有给说明:https://reactnative.cn/docs/native-modules-android/

简介

一共5步:
1、新建rn项目,并用AndroidStudio打开新项目下的Android目录
2、创建一class继承ReactContextBaseJavaModule (这里alt+enter重写构造器+getName()方法,getName()方法返回的string值将在js中被调用
3、创建一class 实现ReactPackage接口,(这里将重写createNativeModules()方法【用于添加Module】+createViewManagers()方法)
ps:createNativeModules用于调用原生模块时,createViewManagers用于调用原生组件时,看名字就能区别出来。
4、MainApplication.java中添加第3步中的package。
5、在rn中调用

简单使用(一)

ReactNative 调用Android 原生(一)——原生模块(一)_第1张图片

主要为了熟悉下上面几个步骤

1、新建rn项目,并用AndroidStudio打开新项目下的Android目录。(这个就不多说了)
2、创建一class继承ReactContextBaseJavaModule (这里alt+enter重写构造器+getName()方法,getName()方法返回的string值将在js中被调用
温馨提示: getName()方法注释

public class TestModules extends ReactContextBaseJavaModule {
    private ReactApplicationContext mContext;

    public TestModules(ReactApplicationContext reactContext) {
        super(reactContext);
        mContext = reactContext;
    }

    @Override
    public String getName() {
        //注意 这里的名字才是RN中被调用的名字
        return "TestModules";
    }

    /**
     * 调用Android原生模块,可传递的参数类型如下
     * Boolean -> Bool
     *Integer -> Number
     * Double -> Number
     * Float -> Number
     * String -> String
     * Callback -> function
     * ReadableMap -> Object
     * ReadableArray -> Array
     * 想了解ReadableMap使用 参考:https://blog.csdn.net/danfengw/article/details/83859935
     * @param msg
     */
    @ReactMethod
    public void Toasts(ReadableMap msg) {
        ReadableNativeMap map= (ReadableNativeMap) msg;
        HashMap map2=map.toHashMap();
        Toast.makeText(mContext, (String) map2.get("name"), Toast.LENGTH_SHORT).show();
    }
 }

3、创建一class 实现ReactPackage接口,(这里将重写createNativeModules()方法【用于添加Module】+createViewManagers()方法)

public class TestPackages implements ReactPackage {
    @Override
    public List createNativeModules(ReactApplicationContext reactContext) {
        List nativeModules = new ArrayList<>();
        nativeModules.add(new TestModules(reactContext));
        return nativeModules;
    }

    @Override
    public List createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

4、MainApplication.java中添加第3步中的package。

public class MainApplication extends Application implements ReactApplication {

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

        @Override
        protected List getPackages() {
            return Arrays.asList(
                    new MainReactPackage(),
                    new SQLitePluginPackage(),  // register SQLite Plugin here
                    new TestPackages()
            );
        }

        @Override
        protected String getJSMainModuleName() {
            return "index";
        }
    };

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

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

5、在rn中调用
导入NativeModules
就直接在App.js里面改的

import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View, NativeModules, DeviceEventEmitter} from 'react-native';
import NativeTimerView from "./src/component/NativeTimerView";
type Props = {};
export default class App extends Component {
  constructor() {
    super();
  }
  toast = () => {
    let obj = {
      id: 1,
      name: "xiaohong"
    };
    //这里的TestModules对应 getName()返回的
    NativeModules.TestModules.Toasts(obj);
  };
  render() {
    return (
      
        Welcome to React Native!
      
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

简单使用(二)

https://blog.csdn.net/danfengw/article/details/83901889

你可能感兴趣的:(React,Native,ReactNative,调用Android原生)