Android原生App跳转到React Native App

前言

众所周知,react native开发是前几年较火的一个话题,随着各种框架的更新换代,一些技术也会逐渐被掩埋。本篇是楼主在项目中总结出的一些开发经验。主要讲了react native和原生的app之间的通讯与沟通。

首先,react native的配置就不做赘述。具体可参考:

React Native中文网: https://reactnative.cn/docs/0.51/getting-started.html

里面讲述的很清晰,一步一步配下来就可以了。

在讲述原生跳转Rn App前,我先说一下两个原生的App之间的跳转,其实Rn和这个是大同小异。只不过是Rn在嵌入到原生中而已。app之间跳转传参其实在生活中很常见的,例如,我们通过一款应用调取地图App,并且将坐标传过去显示出来或者导航,支付调取支付宝App并且传递金额进行支付等。

App从一个App跳到另一个App

详情可参考:https://blog.csdn.net/hust_twj/article/details/73477454

Intent intent = new Intent();          
//可以设置另一个App的启动模式
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
//intent传参和activity跳转传参一样的
intent.putString("param", "param");
//参数1:要调用另一个APP的activity所在的包名
//参数2:要调用另一个APP的activity名字
intent.setClassName("com.xxx.xxx",
                    "com.xxx.xxx.MainActivity");
startActivity(intent);

App跳转到Rn App

React Natived的App其实最外层也是一个原生的页面里面嵌入了很多Rn的页面,你只需要将跳转到页面是Rn的mainActivity即可

那么剩余的工作就是Rn App原生层和Rn层怎么通讯了,解决了这一步就可以实现了跳转传参的问题了。

React native和原生通讯的方式主要有三种:

(1)RCTDeviceEventEmitter 事件方式

(2)Callback 回调方式

(3)Promises 方式

这里只讲述第二种模式;

详情可参考:https://blog.csdn.net/asddavid/article/details/53338616

先写一个react native的MyReactPackage,用来在Rn中注册该模块。代码如下:

public class MyReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

        List<NativeModule> modules=new ArrayList<>();
        modules.add(new MyNativeModule(reactContext));

        return modules;
    }


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

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

在写一个MyNativeModule,用于给Rn调用的方法

public class MyNativeModule extends ReactContextBaseJavaModule {

    public static final String REACTCLASSNAME = "MyNativeModule";

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

    @Override
    public String getName() {
        return REACTCLASSNAME;
    }

    /**
     * 必须添加反射注解不然会报错
     * 这个方法就是ReactNative将要调用的方法,会通过此类名字调用
     * @param
     */
    @ReactMethod
    public void callNativeMethod() {
        //调用Test类中的原生方法。
        //在这里写你要在Rn中需要原生中逻辑,比如传参或者其他方法等
        //注册一个方法在原生中调用
      reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("EventName", params);
   }
}

然后在Rn中的代码里,在自己想要获得参数或者调用原生中的方法的页面中调取callNativeMethod这个方法。

例如:在你的入口文件index.js中的生命周期中:

   componentDidMount() {
       this.EventNameListener = DeviceEventEmitter.addListener('EventName', this.onGetResult);
       NativeModules.MyNativeModule.callNativeMethod()
    }

上面再onGetResult方法中可以获得参数

onGetResult = (data) => {
    //data是传过来的参数
}

最后,附上源码

由于项目没有node_modules,要npm install一下

最后感谢:

https://blog.csdn.net/hust_twj/article/details/73477454

https://blog.csdn.net/asddavid/article/details/53338616




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值