RN做爲混合開發,確定須要與原生直接的頁面跳轉,這裏也屬於和原生端通訊的知識模塊。咱們知道Android的頁面跳轉是經過Intent、Rn是經過路由,而二者直接頁面互相跳轉就須要原生藉助JS暴露接口給Rn來實現了。先上效果圖:javascript
Demo源碼地址: github.com/aiyangtianc…運行項目:React Native配置環境,運行第一個RN項目java
集成項目:React Native教程——集成到現有原生應用react
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(createView());
}
private View createView() {
LinearLayout ll= new LinearLayout(this);
ll.setGravity(Gravity.CENTER);
ll.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
// 設置文字
TextView mTextView = new TextView(this);
mTextView.setText("hello world");
LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
// 在父類佈局中添加它,及佈局樣式
ll.addView(mTextView, mLayoutParams);
return ll;
}
複製代碼
注意:方法頭要加@ReactMethodandroid
/**
* 原生Activity與React交互——模塊
*/
public class MyIntentModule extends ReactContextBaseJavaModule {
public MyIntentModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "IntentMoudle";
}
//注意:記住getName方法中的命名名稱,JS中調用須要
@ReactMethod
public void startActivityFromJS(String name, String params){
try{
Activity currentActivity = getCurrentActivity();
if(null!=currentActivity){
Class toActivity = Class.forName(name);
Intent intent = new Intent(currentActivity,toActivity);
intent.putExtra("params", params);
currentActivity.startActivity(intent);
}
}catch(Exception e){
throw new JSApplicationIllegalArgumentException(
"不能打開Activity : "+e.getMessage());
}
}
@ReactMethod
public void dataToJS(Callback successBack, Callback errorBack){
try{
Activity currentActivity = getCurrentActivity();
String result = currentActivity.getIntent().getStringExtra("data");
if (TextUtils.isEmpty(result)){
result = "沒有數據";
}
successBack.invoke(result);
}catch (Exception e){
errorBack.invoke(e.getMessage());
}
}
//注意:startActivityFromJS、dataToJS方法添加RN註解(@ReactMethod),不然該方法將不被添加到RN中
}
複製代碼
實現ReactPackage接口暴露給RN調用,在createNativeModules裏註冊上一步添加的模塊:git
/**
* 註冊模塊
*/
public class MyReactPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new MyIntentModule(reactContext));
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
複製代碼
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new MyReactPackage()
);
}
複製代碼
import React, { Component } from 'react';
import {
View,
NativeModules,
TouchableNativeFeedback,
ToastAndroid
} from 'react-native';
export default class App extends Component<{}> {
_onPressButton() {
console.log("You tapped the button!");
NativeModules
.IntentMoudle
.startActivityFromJS("com.myreactdemo.MyActivity", null);
}
render() {
return (
<View>
<TouchableNativeFeedback onPress={this._onPressButton}>
<Text>跳轉到原生頁面</Text>
</TouchableNativeFeedback>
</View>
);
}
}
複製代碼
能夠在rn中拿到activity跳轉傳遞的值,值的傳遞跟普通activity之間的跳轉沒有差異:github
[javascript] view plain copy
getData() {
NativeModules.IntentModule.dataToJS((msg) => {
console.log(msg);
let base = require('./constant');
base.columnID = msg;
//ToastAndroid.show('JS界面:從Activity中傳輸過來的數據爲:' + base.columnID, ToastAndroid.SHORT);
},
(result) => {
ToastAndroid.show('JS界面:錯誤信息爲:' + result, ToastAndroid.SHORT);
})
}
複製代碼
拿到這個值以後存在了常量類裏,就是經過這個常量來實現跳轉到不一樣的界面,以後的事情就迎刃而解了:npm
[java] view plain copy
componentDidMount() {
let base = require('./constant');
//ToastAndroid.show(base.columnID, ToastAndroid.SHORT);
let id = base.columnID;
if (id == "3") {
const { navigator } = this.props;
if (navigator) {
navigator.push({
name: 'secondPage',
component: secondPage,
})
}
} if (id == "4") {
const { navigator } = this.props;
if (navigator) {
navigator.push({
name: 'otherPage',
component: otherPage,
})
}
}
}
複製代碼
輸入命令啓動應用:react-native
1.進入項目根目錄:bash
cd MyReactDemo
複製代碼
2.運行:服務器
react-native run-android
複製代碼
*若是設備沒安裝上AwesomeProject,可直接用Android studio或eclipse開發工具打開AwesomeProject文件裏的Android項目,點擊run運行安裝便可。運行應用首先須要啓動開發服務器(Packager)
npm start
複製代碼
最後以爲文章還不錯喜歡的點個贊給個喜歡鼓勵下唄~