如果你有一个已经开发好或者正在开发的原生应用,此时想使用ReactNative来开发其中某个功能,那么这篇文章会一步步告诉,如何移植一个已有的原生Android项目.
目前业内主流的方式,部分模块或功能使用ReactNative试水,且更多的还是使用React来做V的工作,类似网络请求等功能还是通过调用原生封装的组件来实现(ReactNative暂时没有支持https),听说阿里、饿了么等大型互联网公司目前是用这个方式来试水ReactNative。
- 步骤一
1、准备App
新建一个文件夹Demo1,使用AS在Demo1文件夹中新建一个项目,名称为android,此时Demo1目录结构如下
其中android便是AS新建的项目,它的目录结构如下
Paste_Image.png2、新建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.png2、打开工程目录中的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
网友评论
React ->Native 能否打开,传点数据过去。