从React-Native代码调用Android活动

时间:2017-02-15 15:22:51

标签: 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

1 个答案:

答案 0 :(得分:28)

要启动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的{​​{1}},如下所示:

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() ); } addPackage(new ActivityStartecReactPackage())

您可以找到complete, self-contained example here

<强>更新

ReactInstanceManager.builder()已从版本0.47中的createJSModules界面中删除,并已从示例中注释掉。如果你出于某种原因坚持使用较旧版本的RN,你仍然需要它。

2019年3月更新

The sample project现在支持iOS的类似功能。