从React-Native代码调用Android活动
我正在使用REACT-NATIVE来构建
Android应用程序.
我想从React-Native代码调用android活动. (当我点击我的反应本机代码中的按钮时,它应该调用android活动) 我有4个类文件 > MainActivity.java(在android studio中打开时由react-native创建) 想要实现以下流程: 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,你仍然需要它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |