react-native调用安卓代码-高级应用

本文介绍如何在 React Native 中调用 Android 原生代码,包括创建 Java 模块、注册模块及在 React Native 应用中使用这些模块的方法。此外,还介绍了如何通过 Promise 实现更复杂的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

react-native调用安卓代码

第一步

写一个类来封装要调用的方法

package com.rndemo;

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;

import java.util.HashMap;
import java.util.Map;

/**
 * 描述:
 * <p>
 * 作者: 向金海
 * 时间: 2017/11/3 14:53
 */

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);
    }


    /**
     *  在rn中使用的组件名  如:
     *   import { NativeModules } from 'react-native';
     *   export default NativeModules.ToastExample;
     */
    @Override
    public String getName() {
        return "ToastExample";
    }

    /**
     *  给js使用的常量 如:
     *  import Toast from './js/ToastExample';
     *  
     *  Toast.show('哈哈哈',Toast.SHORT)
     */
    @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;
    }

    /**
     * 给到js调用的方法
     * @param message 参数
     * @param duration 参数
     */
    @ReactMethod
    public void show(String message, int duration) {
        /*
         * 在方法里面可以实现各种安卓原生的东西,如跳转界面,打开图片选择器
         */

        Toast.makeText(getReactApplicationContext(), message, duration).show();

        Intent intent = new Intent(getReactApplicationContext(),AboutActivity.class);
        getReactApplicationContext().startActivity(intent);
    }

}

第二步

将模块注册

package com.rndemo;

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;

/**
 * 描述:将新加模块注册
 * <p>
 * 作者: 向金海
 * 时间: 2017/11/3 14:56
 */

public class AnExampleReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new ToastModule(reactContext));

        return modules;
    }

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

第三步

添加到application中

package com.rndemo;

import android.app.Application;

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.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {

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

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
                    new AnExampleReactPackage() // 将新加的包添加到这里
            );
        }

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

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

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

在rn中调用

获取到对应的组件

'use strict';

import { NativeModules } from 'react-native';

// 下一句中的ToastExample即对应上文
// public String getName()中返回的字符串

export default NativeModules.ToastExample;

在相应的地方调用

import Toast from './js/ToastExample';
Toast.show('哈哈哈',Toast.SHORT)

提个小小的坑
点击事件一定要这样写,不然会一进来就执行,然后没点击作用了##初学js

onPress={()=>Toast.show('哈哈哈',Toast.SHORT)}

高级应用

有时我们需要使用java或安卓的代码处理业务然后返回给rn,我们可以这样做

    // 在安卓接收方法  这里演示的是解密接口数据,然后通过Promise回调回去
    @ReactMethod
    public void decodingResult(String raw, String url, final Promise promise) {

        Log.e("HHH", "decodingResult: " + raw + url );
        String resTmp = DESUtil.decryptDES(raw, SHAPassWord.SHA1(url.substring(url.lastIndexOf("/") + 1)).substring(0, 8));

        Log.e("HHH", "decodingResult: " + resTmp );
        promise.resolve(resTmp);
    }

Promise 有几个方法回调其中resolve是成功的回调

// rn端调用此方法
Decode.decodingResult(responseText, url)
                .then((msg) => {
                    console.log('response data : ',msg);
                    callback(JSON.parse(msg));
                })
                .catch((err) => {
                    console.log('--------------error-----------------');
                    alert(err);
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值