如果在开发中要用到一个 RN 没有提供的组件,或者想复用 Java 代码已经实现的组件而不是用 JavaScript 再造一个车轮子,或者想使用 Java 高效的处理图片、访问数据库、多线程编程等,你可以使用 RN 做到 JavaScript 与 Java 异步通信。

这里我们以 Android 提供的 Toast 为例。在 RN 工程里使用 JavaScript 调用 Android 系统的 Toast。

首先来看一下工程目录结构:



如上图,我们的工程叫 Awesome。左侧的是 Atom 工程,右侧的是将其中的 android/app 目录导入 Android Studio 后的 工程。
Java 文件包括:

  • MainActivity.java;
  • AwesomeReactPackage.java;
  • ToastModule.java,RN 已经提供了该文件,实际开发过程中直接引用即可,本文为了学习需要单独写出;

JavaScript 文件包括:

  • index.android.js;
  • ToastAndroid.js。

文件内容分别如下:
MainActivity

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {    private ReactInstanceManager mReactInstanceManager;    private ReactRootView mReactRootView;    @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")                .addPackage(new MainReactPackage())                .setUseDeveloperSupport(BuildConfig.DEBUG)                .setInitialLifecycleState(LifecycleState.RESUMED)                .build();        mReactRootView.startReactApplication(mReactInstanceManager, "Awesome", null);        setContentView(mReactRootView);    }    @Override    public boolean onKeyUp(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {            mReactInstanceManager.showDevOptionsDialog();            return true;        }        return super.onKeyUp(keyCode, event);    }    @Override    public void onBackPressed() {        if (mReactInstanceManager != null) {            mReactInstanceManager.onBackPressed();        } else {            super.onBackPressed();        }    }    @Override    public void invokeDefaultOnBackPressed() {        super.onBackPressed();    }    @Override    protected void onPause() {        super.onPause();        if (mReactInstanceManager != null) {            mReactInstanceManager.onPause();        }    }    @Override    protected void onResume() {        super.onResume();        if (mReactInstanceManager != null) {            mReactInstanceManager.onResume(this, this);        }    }    protected List<ReactPackage> getPackages() {        return Arrays.<ReactPackage>asList(                new MainReactPackage(),                new AwesomeReactPackage());    }}

ToastModule

public class ToastModule extends ReactContextBaseJavaModule {  private static final String DURATION_SHORT_KEY = "SHORT";  private static final String DURATION_LONG_KEY = "LONG";  public ToastModule(ReactApplicationContext reactContext) {    super(reactContext);  }  @Override  public String getName() {    return "ToastAndroid";  }  @Override  public Map<String, Object> getConstants() {    final Map<String, Object> constants = new HashMap<>();    constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);    constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);    return constants;  }  @ReactMethod  public void show(String message, int duration) {    Toast.makeText(getReactApplicationContext(), message, duration).show();  }}

AwesomeReactPackage

public class AwesomeReactPackage implements ReactPackage {    @Override    public List<NativeModule> createNativeModules(            ReactApplicationContext reactContext) {        List<NativeModule> modules = new ArrayList<>();        modules.add(new ToastModule(reactContext));        return modules;    }    @Override    public List<Class<? extends JavaScriptModule>> createJSModules() {        return null;    }    @Override    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {        return null;    }}

ToastAndroid

var { NativeModules } = require('react-native');module.exports = NativeModules.ToastAndroid;

在 index.android.js 中使用 ToastAndroid:

var ToastAndroid = require('./ToastAndroid');ToastAndroid.show('Awesome', ToastAndroid.LONG);

下面讲解各个文件的作用。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. android 浏览器 打开本地html文件的方法
  6. 如何部署android sdk中的demo
  7. 利用Android(安卓)Studio构建App
  8. windows环境下获取安卓应用的MD5签名,SHA1签名,SHA256签名等(适用于
  9. cocos2d-x for android:HelloWorld 解读

随机推荐

  1. Android图片双指缩放,单指移动实现
  2. Android 悬浮窗在状态栏之上不影响其他操
  3. android软件开发:后台监控应用程序包的安
  4. Android(安卓)Studio 实现一个简单的计算
  5. AndroidManifest.xml文件详解(grant-uri-p
  6. Android Studio报错Error while executin
  7. android 根据非物理路径得到物理路径
  8. 用最新的elipse搭建android开发环境
  9. Android替换/修改系统默认输入法
  10. Android Bitmap 工具类