2017-02-15 87 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,您仍然需要它。