从React-Native代码调用Android活动

前端之家收集整理的这篇文章主要介绍了从React-Native代码调用Android活动前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用REACT-NATIVE来构建 Android应用程序.
我想从React-Native代码调用android活动. (当我点击我的反应本机代码中的按钮时,它应该调用android活动)

我有4个类文件

> MainActivity.java(在android studio中打开时由react-native创建)
> MainApplication.java(由react-native创建)
> Login.java(android活动文件)
> Example.java(android活动文件)

想要实现以下流程:

Login.java – > React-Native js – > Example.java

我已经通过以下链接,但无法理解

https://stackoverflow.com/a/32825290/4849554

类似的问题在这里问

React Native Android: Showing an Activity from Java

要启动Android活动,您需要创建自定义本机模块.假设一个名为ActivityStarter;它可以从JavaScript中使用如下:
import { ...,NativeModules,... } from 'react-native';

export default class DemoComponent extends Component {
    render() {
        return (
        <View>
            <Button
                onPress={() => NativeModules.ActivityStarter.navigateToExample()}
                title='Start example activity'
            />
        </View>
        );
    }
}

ActivityStarter只是一个Java类,它实现了一个名为NativeModule的React Native Java接口. BaseJavaModule已经完成了这个接口的繁重工作,因此通常会扩展一个或ReactContextBaseJavaModule:

class ActivityStarterModule extends ReactContextBaseJavaModule {

    ActivityStarterModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod
    void navigateToExample() {
        ReactApplicationContext context = getReactApplicationContext();
        Intent intent = new Intent(context,ExampleActivity.class);
        context.startActivity(intent);
    }
}

这个班的名字并不重要;暴露给JavaScript的ActivityStarter模块名称来自getName()方法.

react-native init生成的默认应用程序包含一个初始化React Native的MainApplication类.除此之外,它还扩展了ReactNativeHost以覆盖其getPackages方法

@Override
protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
            new MainReactPackage()
    );
}

如果您要将React Native添加到现有应用程序,this page是否覆盖了Activity的onCreate,如下所示:

@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,"HelloWorld",null);

    setContentView(mReactRootView);
}

注意addPackage(new MainReactPackage()).无论您使用哪种方法,都需要添加一个公开我们的自定义模块的自定义包.它可能看起来像这样:

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

    // UPDATE: This method was deprecated in 0.47
    // @Override
    // public List<Class<? extends JavaScriptModule>> createJSModules() {
    //     return Collections.emptyList();
    // }

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

最后,更新MainApplication以包含我们的新包:

@Override
protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
            new ActivityStarterReactPackage(),// This is it!
            new MainReactPackage()
    );
}

或者你可以对ReactInstanceManager.builder()执行addPackage(new ActivityStartecReactPackage()).

你可以找到一个完整的,self-contained example here.

UPDATE

createJSModules已从版本0.47中的ReactPackage接口中删除,并已从示例中注释掉.如果由于某种原因你坚持使用较旧版本的RN,你仍然需要它.

猜你在找的React相关文章