React Native实现js调用安卓原生代码

1 问题

   实现js调用安卓原始代码,直接上代码,简单粗暴

 

 

 

 

2 代码实现

   1) 实现一个继承ReactContextBaseJavaModule的类,MyToastModule.java文件如下

public class MyToastModule extends ReactContextBaseJavaModule {public MyToastModule(ReactApplicationContext reactContext) {super(reactContext);}/*** getName方法返回一个字符串名字,就是js中的模块名* 到时候我们写js的时候需要导入这个模块,这里我用的是MyToast*/@Overridepublic String getName() {return "MyToast";}/*** 这是js调用的方法,需要使用注解@ReactMethod,返回类型必须为void*/@ReactMethodpublic void show() {Toast.makeText(getReactApplicationContext(), "I am chenyu", Toast.LENGTH_SHORT).show();}
}

 getName()方法返回一个字符串名字,就是js中的模块名,到时候我们写js的时候需要导入这个模块,这里我用的是MyToastshow()方法 show()方法是到时候js调用的方法,需要使用注解@ReactMethod,返回类型必须为void

 

 2) 实现继承ReactPackage的一个类

   MyToastReactPackage.java 文件如下

package com.pro_react;import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** */public class MyToastReactPackage implements ReactPackage {/*** 需要在应用的Package类的createNativeModules方法中添加这个模块。* 如果模块没有被注册,它也无法在JavaScript中被访问到。* @param reactContext* @return*/@Overridepublic List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();modules.add(new MyToastModule(reactContext));return modules;}@Overridepublic List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {return Collections.emptyList();}
}

这里的createNativeModules方法需要添加我之前写的MyToastModule模块

 

  3 )  在MainApplication.java文加的getPackages方法中添加我自己的包,代码如下

package com.pro_react;import android.app.AppOpsManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
import android.os.Build;
import android.util.Log;import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;public class MainApplication extends Application implements ReactApplication {public static final String TAG = "MainApplication";private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected List<ReactPackage> getPackages() {Log.i(TAG, "MainApplication getPackages");return Arrays.<ReactPackage>asList(new MainReactPackage(),new MyToastReactPackage());}@Overrideprotected String getJSMainModuleName() {return "index";}};@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "MainApplication onCreate");SoLoader.init(this, /* native exopackage */ false);}
}

  4) js模块的编写

      js模块要注意你需要加入这个

import {NativeModules} from 'react-native'

然后用变量保存安卓的模块,也就是上面getName方法里面的返回值MyToast

var myAndroidToast = NativeModules.MyToast;

然后我是模拟,文本点击触发的调用原声安卓的函数,App.js文件如下

/*** Sample React Native App* https://github.com/facebook/react-native** @format* @flow*/import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View, NativeModules} from 'react-native';const instructions = Platform.select({ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',android:'Double tap R on your keyboard to reload,\n' +'Shake or press menu button for dev menu',
});
var myAndroidToast = NativeModules.MyToast;
type Props = {};
export default class App extends Component<Props> {render() {return (<View style={styles.container}><Text onPress={()=> this._androidShowMsg()} style={styles.welcome}>Welcome to React Native!</Text><Text style={styles.instructions}>To get started, edit App.js</Text><Text style={styles.instructions}>{instructions}</Text></View>);}/***调用安卓原生代码 * @private*/_androidShowMsg = () => {myAndroidToast.show();};     }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,},
});

 

 

 

3 运行结果

运行之前要记得在项目的目录下执行下面的命令,它会在android的assets目录下生成index.android.bundle文件,也就是安卓会加载这个js文件,这里也会起到编译js作用,如果有语法错误,这里控制台会提示

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

然后执行运行项目命令

react-native run-android

点击Welcome to React Native运行结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发布nuget包的正确姿势---cicd自动打包发布

最轻便的发布nuget包方式&#xff0c;方便cicd自动打包发布nuget包首先新建项目项目名随便取&#xff0c;这里就叫它GuiH.ClassLibrary默认即可&#xff0c;需要改目标版本时&#xff0c;等创建好再改项目创建好了随便写个接口方法namespace GuiH.ClassLibrary {public class C…

我的世界服务器物品属性,属性 - Minecraft Wiki,最详细的官方我的世界百科

属性(Attributes)是生物和玩家身上的增益/减益特性系统。属性也存在修饰符(Modifiers)中&#xff0c;用于调整属性的强度。属性应用[]当应用到一个物品&#xff0c;一个物品的修饰符将增加或减少以修正相应的属性下面的命令将给最近的玩家一把增加20( 10)点额外伤害的钻石剑&a…

分布式和微服务区别_深度解析spring cloud分布式微服务的实现

分布式系统微服务就是原来臃肿的项目拆分为多个模块互不关联。如&#xff1a;按照子服务拆分、数据库、接口&#xff0c;依次往下就更加细粒度&#xff0c;当然运维也就越来越难受了。分布式则是偏向与机器将诺大的系统划分为多个模块部署在不同服务器上。微服务和分布式就是作…

通过Shell开发企业级专业服务启动脚本案例(MySQL)

老男孩教育Linux高端运维班Shell课后必会考试题:企业Shell面试题10&#xff1a;开发企业级MySQL启动脚本说明:MySQL启动命令为&#xff1a;/bin/sh mysqld_safe --pid-file$mysqld_pid_file_path 2>&1 >/dev/null &停止命令逻辑脚本为&#xff1a;mysqld_pidcat …

React Native之js调用Android原生使用Callback传递结果给js

如果不清楚js如何调用Android原生,可以先参考我的这篇博客React Native实现js调用安卓原生代码 1 问题 上面的文章只是调用安卓原生显示Toast,但是我们一般会需要调用安卓的代码然后去拿回结果给js,但是我们知道在android层js调用的这个函数返回值必须的void,所以我们需要用到…

ENVI帮助研究人员发现金矿

本文转自&#xff1a;http://www.esrichina-bj.cn/2012/0319/1663.html 遥感影像能让我们实时的获取地理区域的准确信息&#xff0c;这些为很多石油、天然气和矿产的开采提供关键的信息&#xff0c;节约实地测量的成本&#xff0c;提高工作效率。 美国圣路易斯大学的研究人员希…

C# 使用TCP创建HTTP客户程序

首先&#xff0c;创建一个控制台应用程序(包)&#xff0c;向 Web 服务器发送一个 HTTP 请求。以前用 HttpClient 类实现了这个功能&#xff0c;但使用 TcpClient 类需要深入 HTTP 协议。HttpClientUsingTcp 示例代码使用了以下名称空间:System System.IO System.Net.Sockets …

迅捷路由器 服务器无响应,如果路由器重启还是上不了网 几招搞定

如果网速很慢重启了路由器之后结果还是慢&#xff0c;而且甚至上不了网了那该怎么办。如果有这种情况原因其实有很多很多的可能&#xff0c;需要逐个排查&#xff0c;首先需要进入192.168.1.1路由器的管理设置界面&#xff0c;查看路由器的运行状态。路由器设置、路由器没有成功…

Azure DevOps 中 Dapr项目自动部署流程实践

注&#xff1a;本文中主要讨论 .NET6.0项目在 k8s 中运行的 Dapr 的持续集成流程, 但实际上不是Dapr的项目部署到K8s也是相同流程&#xff0c;只是k8s的yaml配置文件有所不同流程选择基于 Dapr 的项目持续集成包含以下流程编译并打包项目构建 Dockerfile,并推送镜像push image至…

React Native之js同步调用安卓原生方法@ReactMethod(isBlockingSynchronousMethod = true)

1 问题 之前的代码js调用安卓原生都是用的异步方法,比如callback, promiss,异步的话,我们一般是在安卓原生有耗时操作,才用异步,如果我要离开返回,就需要js调用安卓同步方法 利用callback实现js调用原生可以参考我的这篇博客 React Native实现js调用安卓原生代码 React Nat…

用POP动画引擎实现弹簧动画(POPSpringAnimation)

效果图: #import "ViewController.h" #import <POP.h>interface ViewController ()property (nonatomic, weak) UIView *testView;endimplementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor [UIColor blackColor…

地理知识归纳:影响降水的九大因素

降水指大气中水汽凝结降落的过程,包括降雨、下雪、冰雹等形式,降水的多少要受很多因素的影响,但主要条件是三个:充足的水汽供应,气流上升达到过饱和状态,足够的凝结核。通常情况下,我们不需要考虑凝结核的问题,只是考虑有没有充足的水汽和促使气流上升的机制就可以,归…

linux 查看cpu_作为高级Java,你应该了解的Linux知识

作为一个javaer&#xff0c;我以前写过很多关于Linux的文章。但经过多年的观察&#xff0c;发现其实对于大部分人&#xff0c;有些东西压根就用不着。用的最多的&#xff0c;就是到线上排查个问题而已&#xff0c;这让人很是苦恼。那么&#xff0c;我们就将范围再缩小一下。最有…

layer和3D仿射变换

1、视图的显示基于图层&#xff0c;通过控制图层同样能控制显示效果&#xff0c;获取当前的视图的layer,并为其增加圆角边框。 //设置layer边框的宽度为2view.layer.borderWidth2;//如果需要为layer添加颜色需要转换为CGColor对象view.layer.borderColor[UIColor greenColor].C…

React Native之Android原生通过DeviceEventEmitter发送消息给js

1 问题 Android原生向js发消息,并且可以携带数据 2 实现原理 Android原生可以使用RCTEventEmitter来注册事件,然后这里需要指定事件的名字,然后在js那端进行监听同样事件的名字监听,就可以收到消息得到数据 Android注册关键代码 reactContext.getJSModule(DeviceEventManag…

CentOS安装JAVA JDK

普通情况下&#xff0c;我们都要将linux自带的OPENJDK卸载掉。然后安装SUN的JDK。首先查看Linux自带的JDK是否已安装。 输入例如以下命令&#xff0c;查看已经安装的JAVA版本号信息。 Linux代码 java -version 输入例如以下命令。查看JDK的信息。Linux代码 rpm -qa|grep j…

安装bigdesk后es无法启动_安装天正后,探索者无法双击启动?

用户经常会出现&#xff0c;安装天正后&#xff0c;探索者无法双击启动&#xff0c;或者是图纸无法拖拽入CAD中&#xff0c;如何解决&#xff1f;答&#xff1a;天正安装完成后&#xff0c;默认将CAD的acad.exe程序&#xff0c;添加了“以管理员身份运行此程序”而导致的&#…

服务器安全维护包含,服务器安全维护包含

服务器安全维护包含 内容精选换一换本章节介绍如何使用管理控制台向导创建裸金属服务器。创建裸金属服务器时&#xff0c;您需要配置规格、镜像、存储、网络、安全组等必备信息。同时&#xff0c;向导也提供了丰富的扩展配置功能&#xff0c;方便您进行个性化部署和管理。在创建…

C# 发出异步的Get请求

下列的下载代码示例是 HttpClientSample。它以不同的方式异步调用Web 服务。为了演示本例使用的不同方法&#xff0c;使用了命令行参数。示例代码使用了以下名称空间&#xff1a;System System.Linq System.Net System.Net.Http System.Net.Http.Headers System.Threading Sy…

React Native之Props(属性)和State(状态)和简单样式简单使用

1 Props(属性)和State(状态)和简单样式简单使用App.js代码如下 /*** Sample React Native App* https://github.com/facebook/react-native** format* flow*/import React, {Component} from react; import {Platform, StyleSheet, Text, View, NativeModules, DeviceEvent…