2017-02-15 31 views
3

我正在使用REACT-NATIVE构建Android应用程序。 我想从React-Native代码中调用android活动。 (说当我点击该按钮在我的反应原生代码,它应该调用Android的活动)从React-Native代码调用Android活动

我有4类文件

  • MainActivity.java(由反应原生创建在Android Studio中打开时)
  • MainApplication.java
  • Login.java(机器人活动文件)
  • Example.java(机器人活动文件)
(由反应本地创建的)

想实现以下流程:

Login.java - >阵营本地JS - > Example.java

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

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

类似的问题在这里问

React Native Android: Showing an Activity from Java

回答

10

要启动Android活动,您需要创建自定义本机模块。假设一个叫ActivityStarter;

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就是实现所谓NativeModule一个阵营机Java接口的Java类:它可能在JavaScript如下使用。该接口的繁重已被BaseJavaModule完成的,所以人们通常将扩充一个或​​:

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

如果您要添加本地做出反应到现有的应用程序,this page有你重写你的ActivityonCreate如下:

@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())ReactInstanceManager.builder()

您可以找到一个完整的self-contained example here


UPDATE

createJSModulesReactPackage接口在0.47版本中删除,并已被注释掉样品。出于某种原因,如果您遇到较旧版本的RN,您仍然需要它。