React Native & Android集成
1. 新建一个项目在Android studio 里直接创建一个空工程(这里方便测试可以先把项目的目录改成android), 在app的依赖里面添加React Native的依赖: dependencies {
compile fileTree(dir: "libs",include: ["*.jar"])
compile "com.android.support:appcompat-v7:23.0.1"
compile "com.facebook.react:react-native:+" // From node_modules
}
然后在AndroidManifest.xml加入访问网络权限: <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
为了让项目支持调试RN,需要在AndroidManifest.xml里面加入RN的DevSettingsActivity,如下: <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
由于ReactNative的minSdkVersion为16,所以有可能需要在Manifest里添加: <uses-sdk tools:overrideLibrary="com.facebook.react" />
修改MainActivity,如下: public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler{
private ReactRootView mReactRootView;
private ReactInstanceManager mReactInstanceManager;
@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);
}
@Override
public void invokeDefaultOnBackPressed() {
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 void onBackPressed() {
if (mReactInstanceManager != null) {
mReactInstanceManager.onBackPressed();
} else {
super.onBackPressed();
}
}
@Override
public boolean onKeyUp(int keyCode,KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
mReactInstanceManager.showDevOptionsDialog();
return true;
}
return super.onKeyUp(keyCode,event);
}
}
setBundleAssetName先不用管。后面离线打包的时候会用到。 在工程上一级目录下执行 'use strict';
import React,{
Text,View
} from 'react-native';
class ReactNativeProject extends React.Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.hello}>Hello,World</Text>
<Text>我来自ReactNative</Text>
</View>
)
}
}
var styles = React.StyleSheet.create({
container: {
flex: 1,justifyContent: 'center',},hello: {
fontSize: 20,textAlign: 'center',margin: 10,});
React.AppRegistry.registerComponent('HelloWorld',() => ReactNativeProject);
在项目上一级目录执行 在项目上一级目录下执行: curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
在上面生成的package.json中的scripts里面添加一行: "start": "node node_modules/react-native/local-cli/cli.js start"
例如: {
"name": "react-demo","version": "1.0.0","description": "","main": "index.js","scripts": { "start": "node node_modules/react-native/local-cli/cli.js start","test": "echo "Error: no test specified" && exit 1" },"author": "","license": "ISC","dependencies": { "react-native": "^0.39.2" } }
code目录 首先启动RN的npm本地服务: react-native run-android
然后运行就可以了。。。
如果需要在Android studio里面来安装的话,就会提示”Could not get BatchedBridge….”,即RN找不到要加载的包,需要手动执行: react-native start
adb reverse tcp:8081 tcp:8081
react-native start 关于离线打包:react-native bundle –platform android –dev false –entry-file index.android.js –bundle-output android/app/src/main/assets/index.android.bundle –assets-dest android/app/src/main/res 一条命令就可以打包到指定的目录,就不需要在依赖于服务端了 关于代码结构的优化在Native + RN的混合工程中,希望写的代码都在Android项目目录下,比较好维护。就是说要把index.android.js等自己写的js还有资源放在Android工程目录下。关于node_modules目录,如果也放在Android工程下,由于文件太多,AS都能卡死掉,,,所以想要的目录节后为: ├── node_modules
├── android_proj
│ ├── app
│ │ ├── build..
│ │ ├── src..
│ │ └── build.gradle
│ ├── index.android.js
│ ├── rnjs..
调整成这样的目录后,使用`react-native start 启动服务,手机上提示404,RN的packager在默认的目录中没有找到入口js文件。在启动服务时需要添加一个目录。 react-native start --root android_proj
link=> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |