(八)React Native实现调用android原生java方法并实现广播的发送和接受

接触到混合应用开发提议后,首先想到了之前学的ionic,其次便是这两年火遍全球的RN,由于ionic框架用的angular.js,而且angular1和angular2写法区别很大,angular2对于初学者还是比较好接受的,但是angular1写的很乱,代码很难维护,便放弃了。决定用RN后觉得还是蛮顺手的,跟angular2很相似,又是ES6,很快便能入手,框架的选择还需要考虑的是插件支持,尤其是:推送,广播,二维码扫描,服务,本地数据存储这些功能能否实现,由于要与硬件厂商对接,用到广播,就研究了一下如何用RN实现广播。

百度了所有的资料就是找不到如何RN实现原生广播,没有一篇类似的,于是查看一下RN项目结构,看了安卓后决定用AS加载一下看看能不能在里边编辑一下,发现MainApplication能够在应用启动时执行onCreate方法,那么我就一定能在onCreate时Toast一段话或发送一个广播的动作,那么接受发送广播基本实现了,果不其然广播真的接受到了。那么下面我要解决的问题便是RN事件如何触发android原生java代码中的方法,如果这个问题解决了,我就能通过点击事件发送一个广播。

一、RN项目添加广播,跟原生添加广播一样,两种方法,我们采用其中一种常驻广播:

<receiver android:name=".MybroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.broadcastreceiverdemo.broADCAST"></action>
            </intent-filter>
        </receiver>

广播要处理的就是toast一段话:

public class MybroadcastReceiver extends broadcastReceiver {

    @Override
    public void onReceive(Context arg0,Intent arg1) {
        // Todo Auto-generated method stub
        String string=arg1.getStringExtra("data");
        Toast.makeText(arg0,"received:"+string,Toast.LENGTH_SHORT).show();

    }

}

二、React Native 调用原生Android模块
方法参考:http://www.cnblogs.com/lgp142332/p/6024280.html
我们首先来创建一个原生模块。一个原生模块是一个继承了ReactContextBaseJavaModule的java类,它可以实现一些JavaScript所需的功能。我们这里的目标是可以在JavaScript里写ToastAndroid.show(‘Awesome’,ToastAndroid.SHORT);,来调起一个Toast通知

package com.testproject.module;

import android.content.Intent;
import android.widget.Toast;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

/** * Created by Administrator on 2017/4/15. */

public class SendbroadcastModule extends ReactContextBaseJavaModule {

    public SendbroadcastModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "Sendbroadcast";
    }

    @ReactMethod
    public void sendbroadcast(){
        //发送广播
        Toast.makeText(getReactApplicationContext(),"开始发送...",Toast.LENGTH_SHORT).show();
        Intent intent=new Intent("com.example.broadcastreceiverdemo.broADCAST");
        intent.putExtra("data","hello");
        getReactApplicationContext().sendbroadcast(intent);
    }

    @Override
    public boolean canOverrideExistingModule() {
        return true;
    }
}

ReactContextBaseJavaModule要求派生类实现getName方法。这个函数用于返回一个字符串名字,这个名字在JavaScript端标记这个模块。这里我们把这个模块叫做Sendbroadcast,这样就可以在JavaScript中通过React.NativeModules.Sendbroadcast访问到这个模块。

注意:模块名前的RCT前缀会被自动移除。所以如果返回的字符串为”RCTSendbroadcast”,在JavaScript端依然通过React.NativeModules.Sendbroadcast访问到这个模块。

要导出一个方法给JavaScript使用,Java方法需要使用注解@ReactMethod。方法的返回类型必须为void。React Native的跨语言访问是异步进行的,所以想要给JavaScript返回一个值的唯一办法是使用回调函数或者发送事件。

注册模块

在Java这边要做的最后一件事就是注册这个模块。我们需要在应用的Package类的createNativeModules方法添加这个模块。如果模块没有被注册,它也无法在JavaScript中被访问到。

package com.testproject.module;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.testproject.module.SendbroadcastModule;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/** * Created by Administrator on 2017/4/15. */

public class SendbroadcastPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules=new ArrayList<>();
        modules.add(new SendbroadcastModule(reactContext));
        return modules;
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

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

注意:重写的两个方法createJSModules和createViewManagers不能return null,否则运行会报红屏AddAll的错误,一定要return Collections.emptyList();

接着我们需要在MainApplication中的getPackages方法注册

@Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),new BarcodeScannerPackage(),new RealmReactPackage(),new SendbroadcastPackage()//注册广播模块
      );
    }

接下来便是RN的js代码了:

为了让你的功能从JavaScript端访问起来更为方便,通常我们都会把原生模块封装成一个JavaScript模块。这不是必须的,但省下了每次都从NativeModules中获取对应模块的步骤。这个JS文件也可以用于添加一些其他JavaScript端实现的功能

var { NativeModules } = require('react-native');

export { NativeModules as default }

然后在你需要调用的componet中引入NativeModules并调用发送广播的方法

<Text onPress={ () => {
              ToastAndroid.show("。。。",ToastAndroid.SHORT);
              NativeModules.Sendbroadcast.sendbroadcast();
            }}>发送广播</Text>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom