[React Native]移植原生Android项目

作者: zhuhf | 来源:发表于2016-05-13 22:33 被阅读900次

    如果你有一个已经开发好或者正在开发的原生应用,此时想使用ReactNative来开发其中某个功能,那么这篇文章会一步步告诉,如何移植一个已有的原生Android项目.

    目前业内主流的方式,部分模块或功能使用ReactNative试水,且更多的还是使用React来做V的工作,类似网络请求等功能还是通过调用原生封装的组件来实现(ReactNative暂时没有支持https),听说阿里、饿了么等大型互联网公司目前是用这个方式来试水ReactNative。

    • 步骤一

    1、准备App
    新建一个文件夹Demo1,使用AS在Demo1文件夹中新建一个项目,名称为android,此时Demo1目录结构如下

    Paste_Image.png

    其中android便是AS新建的项目,它的目录结构如下

    Paste_Image.png

    2、新建NativeActivity,布局文件包含一个Button,布局文件如下

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"            
      android:orientation="vertical" 
      android:layout_width="match_parent"                       
      android:layout_height="match_parent">    
      <Button        
          android:id="@+id/btn_click"        
          android:layout_width="match_parent"               
          android:layout_height="wrap_content"       
          android:text="点我"/>
    </LinearLayout>
    
    • 步骤二

    1、在你的App里的build.gradle文件中,添加React Native依赖:

    compile 'com.facebook.react:react-native:0.20.+'
    

    2、在你的AndroidManifest.xml里增加Internet访问权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    3、新建ReactActivity,用来包裹ReactNative模块

    public class ReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {    
    private ReactRootView mReactRootView;    
    private ReactInstanceManager mReactInstanceManager;    
    @Override    
    protected void onCreate(@Nullable 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();
        //ReactModule需要和index.android.js中的组件名称一致
        mReactRootView.startReactApplication(mReactInstanceManager, "ReactModule", null);
        setContentView(mReactRootView);    
    }    
    /*** JS不处理返回事件,会触发此方法     */    
    @Override    
    public void invokeDefaultOnBackPressed() {        
        super.onBackPressed();    
    }    
    @Override    
    public void onBackPressed() {        
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();        
        } else {           
            super.onBackPressed();        
        }    
    }    
    @Override    
    protected void onPause() {        
        super.onPause();        
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onPause();        
        }    
     }    
     @Override    
     protected void onResume() {        
         super.onResume();        
         if (mReactInstanceManager != null) {
             mReactInstanceManager.onResume(this, this);        
         }    
     }    
     @Override    
     public boolean onKeyUp(int keyCode, KeyEvent event) {        
         // 开发者菜单        
         if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {            
               mReactInstanceManager.showDevOptionsDialog();            
               return true;        
         }        
         return super.onKeyUp(keyCode, event);    
     }
    }
    

    4、NativeActivity点击按钮跳转到ReactActivity

    public class NativeActivity extends AppCompatActivity {
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_native);
        findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              startActivity(new Intent(NativeActivity.this, ReactActivity.class));
          }
        });
      }
    }
    

    5、AndroidManifest增加devSettings界面(用来设置React开发服务器)

    <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    
    • 步骤三

    1、在你的工程根目录,运行以下代码:会创建一个node模块,然后react-native
    作为npm依赖添加

    npm init
    npm install --save react-native
    

    成功之后Demo1目录结构如下

    Paste_Image.png

    2、打开工程目录中的package.json文件然后在scripts字段下添加如下内容:

    "start": "node node_modules/react-native/local-cli/cli.js start"
    

    3、在工程目录中新建index.android.js文件,并复制以下代码—这是一个简单的React Native界面

    'use strict';
    var React = require('react-native');
      var {
      Text,
      View
    } = React;
    class ReactModule extends React.Component {
      render() {
        return (
          <View style={styles.container}>
          <Text style={styles.hello}>Hello, World</Text>
          </View>
        )
      }
    }
    
    var styles = React.StyleSheet.create({
      container: {
          flex: 1,
          justifyContent: 'center',
      },
      hello: {
          fontSize: 20,
          textAlign: 'center',
          margin: 10,
      },
    });
    
    React.AppRegistry.registerComponent('ReactModule', () => ReactModule);
    

    4、运行项目部署到手机
    使用VSCode,不清楚的同学请查看[React Native]IDE-VSCode

    最终效果图如下:

    device-2016-05-13-222312_0-37.gif

    本文的源码地址Demo1

    相关文章

      网友评论

      • 微凉一季:移植现有到app有一堆爆错找不到
      • fendo:赞一个!
      • 7b01b20d0280:Native->React 能否传数据过去;
        React ->Native 能否打开,传点数据过去。 :sunglasses:

      本文标题:[React Native]移植原生Android项目

      本文链接:https://www.haomeiwen.com/subject/siqmrttx.html