From 8edaf1ea8b658d91bff6016cda3aaff6016399f6 Mon Sep 17 00:00:00 2001
From: chenyabin1 <“chenyabin@jd.com”>
Date: Wed, 11 Dec 2019 18:00:08 +0800
Subject: [PATCH] =?UTF-8?q?function-MEITUAN-module:Android=E5=8E=9F?=
=?UTF-8?q?=E7=94=9F=E5=90=91JavaScript=E5=8F=91=E9=80=81=E6=B6=88?=
=?UTF-8?q?=E6=81=AF1:=E9=80=9A=E8=BF=87createNativeModuls=E5=88=9B?=
=?UTF-8?q?=E5=BB=BAHomeMessageEventModule=E7=94=A8=E4=BA=8E=E5=8E=9F?=
=?UTF-8?q?=E7=94=9F=E7=AB=AF=E5=90=91=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=8F=91?=
=?UTF-8?q?=E9=80=81=E5=AE=9E=E6=97=B6=E6=B6=88=E6=81=AF=E3=80=82=E6=B3=A8?=
=?UTF-8?q?=E6=84=8F=EF=BC=9A=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=E4=B8=BB?=
=?UTF-8?q?=E8=A6=81=E9=80=9A=E8=BF=87ReactContext=E7=9A=84=E5=AE=9E?=
=?UTF-8?q?=E4=BE=8B=E7=B1=BB=E5=AE=8C=E6=88=90=EF=BC=8C=E7=90=86=E8=AE=BA?=
=?UTF-8?q?=E4=B8=8A=E8=83=BD=E6=8F=90=E9=AB=98=E8=AF=A5=E5=AE=9E=E4=BE=8B?=
=?UTF-8?q?=E7=9A=84=E5=9C=B0=E6=96=B9=E9=83=BD=E5=85=B7=E5=A4=87=E9=80=9A?=
=?UTF-8?q?=E7=9F=A5JavaScript=E7=9A=84=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: chenyabin1 <“chenyabin@jd.com”>
---
android/app/build.gradle | 1 +
.../common/react/HomeMessageEventModule.java | 97 +++++++++
.../com/common/react/HomeReactPackage.java | 2 +
.../java/com/common/react/ToastModule.java | 4 +-
.../src/main/java/com/edwin/HomeFragment.java | 196 +++++++++---------
.../app/src/main/res/layout/home_fragment.xml | 11 +
src/scene/Mine/MineScene.js | 10 +-
7 files changed, 222 insertions(+), 99 deletions(-)
create mode 100644 android/app/src/main/java/com/common/react/HomeMessageEventModule.java
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a9732c4..eb011ca 100755
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -144,6 +144,7 @@ dependencies {
// From node_modules
// implementation 'org.greenrobot:eventbus:3.1.1'
implementation files('src/main/libs/eventbus-3.1.1.jar')
+ compile 'org.jetbrains:annotations-java5:15.0'
}
// Run this once to be able to run the application with BUCK
diff --git a/android/app/src/main/java/com/common/react/HomeMessageEventModule.java b/android/app/src/main/java/com/common/react/HomeMessageEventModule.java
new file mode 100644
index 0000000..068b9ba
--- /dev/null
+++ b/android/app/src/main/java/com/common/react/HomeMessageEventModule.java
@@ -0,0 +1,97 @@
+package com.common.react;
+
+
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.modules.core.DeviceEventManagerModule;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+/**
+ * Created by Edwin,CHEN on 2019/12/11.
+ */
+
+public class HomeMessageEventModule extends ReactContextBaseJavaModule {
+
+ private static ReactApplicationContext reactApplicationContext;
+
+ private static HomeMessageEventModule homeMessageEventModule;
+
+ private String eventName;
+
+ private WritableMap params = Arguments.createMap();
+
+ public static HomeMessageEventModule newInstance() {
+ return new HomeMessageEventModule(reactApplicationContext);
+ }
+
+ public HomeMessageEventModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+ this.reactApplicationContext = reactContext;
+ }
+
+ /**
+ * 发送本地时间给JS,相应的JavaScript代码要做好监听
+ *
+ * WritableMap params = Arguments.createMap();
+ * params.putString("eventProperty", "someValue");
+ * String eventName = "EventReminder";
+ * sendEvent(reactContext, eventName, params);
+ *
+ * @param eventName
+ * @param params
+ */
+ public void sendEventToJs(String eventName,
+ @Nullable WritableMap params) {
+ if (reactApplicationContext != null) {
+ reactApplicationContext
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
+ .emit(eventName, params);
+ }
+ }
+
+ public void sendEventToJs() {
+ if (reactApplicationContext != null) {
+ reactApplicationContext
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
+ .emit(eventName, params);
+ }
+ }
+
+
+ public HomeMessageEventModule putEventName(String eventName) {
+ this.eventName = eventName;
+ return this;
+ }
+
+ public HomeMessageEventModule putParam(String key, Object value) {
+ if (key != null) {
+ if (value instanceof String) {
+ params.putString(key, (String) value);
+ } else if (value instanceof Integer) {
+ params.putInt(key,(Integer) value);
+ } else if (value instanceof Double || value instanceof Long) {
+ params.putDouble(key,(Double) value);
+ } else if (value instanceof WritableArray) {
+ params.putArray(key, (WritableArray) value);
+ } else if (value instanceof Boolean) {
+ params.putBoolean(key, (Boolean) value);
+ } else if (value instanceof Map) {
+ params.putMap(key, (WritableMap) value);
+ } else {
+ params.putNull(key);
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public String getName() {
+ return HomeMessageEventModule.class.getSimpleName();
+ }
+}
diff --git a/android/app/src/main/java/com/common/react/HomeReactPackage.java b/android/app/src/main/java/com/common/react/HomeReactPackage.java
index 15c442d..11ffcae 100644
--- a/android/app/src/main/java/com/common/react/HomeReactPackage.java
+++ b/android/app/src/main/java/com/common/react/HomeReactPackage.java
@@ -26,6 +26,8 @@ public List createNativeModules(ReactApplicationContext reactConte
List modules = new ArrayList<>();
modules.add(new ToastModule(reactContext));
modules.add(new HomeReactNativeMessageEventModule(reactContext, new HomeNativeMessageEventListener()));
+ // HomeMessageEventModule用于原生端向服务端发送实时消息
+ modules.add(new HomeMessageEventModule(reactContext));
return modules;
}
diff --git a/android/app/src/main/java/com/common/react/ToastModule.java b/android/app/src/main/java/com/common/react/ToastModule.java
index fb74182..0d0b460 100644
--- a/android/app/src/main/java/com/common/react/ToastModule.java
+++ b/android/app/src/main/java/com/common/react/ToastModule.java
@@ -14,8 +14,6 @@
import java.util.HashMap;
import java.util.Map;
-import javax.annotation.Nullable;
-
/**
* Created by Edwin,CHEN on 2019/10/28.
*/
@@ -43,7 +41,7 @@ public String getName() {
* 让js来取变化的数据
* @return
*/
- @Nullable
+
@Override
public Map getConstants() {
final Map constants = new HashMap<>();
diff --git a/android/app/src/main/java/com/edwin/HomeFragment.java b/android/app/src/main/java/com/edwin/HomeFragment.java
index ad12b9f..0f3e0e3 100644
--- a/android/app/src/main/java/com/edwin/HomeFragment.java
+++ b/android/app/src/main/java/com/edwin/HomeFragment.java
@@ -5,12 +5,11 @@
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.annotation.Nullable;
+import org.jetbrains.annotations.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -18,6 +17,7 @@
import com.common.BaseEvent;
import com.common.Constants;
import com.common.HomeReactInstanceManager;
+import com.common.react.HomeMessageEventModule;
import com.facebook.react.ReactRootView;
import com.meituan.MainActivity;
import com.meituan.R;
@@ -32,98 +32,104 @@
public class HomeFragment extends Fragment {
- public static HomeFragment createHomeFragment() {
- return new HomeFragment();
- }
-
- private View root;
-
- private TextView eventBusFlagText;
-
- private ReactRootView mReactRootView;
-
- private Context mContext;
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (mContext == null) {
- mContext = context;
- }
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- EventBus.getDefault().register(this);
- }
-
- @SuppressLint("InflateParams")
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- root = inflater.inflate(R.layout.home_fragment, null);
- root.findViewById(R.id.open_meituan_text_view).setOnClickListener(l);
- root.findViewById(R.id.event_bus_sender_text_view).setOnClickListener(l);
- eventBusFlagText = root.findViewById(R.id.event_bus_flag_text_view);
- root.findViewById(R.id.event_bus_sender_text_view).setOnClickListener(l);
- initReactRootView(root);
- return root;
- }
-
- private void initReactRootView(View view) {
- mReactRootView = new ReactRootView(mContext);
-
- // The string here (e.g. "MyReactNativeApp") has to match
- // the string in AppRegistry.registerComponent() in index.js
- mReactRootView.startReactApplication(HomeReactInstanceManager.newInstance().getReactInstanceManager(), "MeiTuan", null);
-
- LinearLayout homeReactRootView = view.findViewById(R.id.home_react_view);
- if (homeReactRootView.indexOfChild(mReactRootView) == -1) {
- (homeReactRootView).addView(mReactRootView,0);
- }
- }
-
- private View.OnClickListener l = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.open_meituan_text_view:
- startActivity(new Intent(getActivity(), MainActivity.class));
- break;
- case R.id.event_bus_sender_text_view:
- EventBus.getDefault().post(new HomeEvent());
- EventBus.getDefault().post(new HomeEvent(Constants.HOME_FRAGMENT_SENDER_REFRESH));
- EventBus.getDefault().post(new HomeEvent(Constants.HOME_FRAGMENT_SENDER_COMPLEX, new HomeEvent()));
- break;
- }
- }
- };
-
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onReceiveRefreshEvent(BaseEvent baseEvent) {
- switch (baseEvent.getEventType()) {
- case Constants.HOME_FRAGMENT_SENDER_REFRESH:
- Toast.makeText(getActivity(), "刷新就刷新", Toast.LENGTH_LONG).show();
- break;
- case Constants.HOME_FRAGMENT_SENDER_COMPLEX:
- eventBusFlagText.setText("复杂点儿");
- Toast.makeText(getActivity(), "复杂点儿", Toast.LENGTH_LONG).show();
- break;
- default:
- Toast.makeText(getActivity(), "我就想验证下EventBus", Toast.LENGTH_LONG).show();
- break;
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- EventBus.getDefault().unregister(this);
-
- if (mReactRootView != null) {
- mReactRootView.unmountReactApplication();
- }
- }
+ public static HomeFragment createHomeFragment() {
+ return new HomeFragment();
+ }
+
+ private View root;
+
+ private TextView eventBusFlagText;
+
+ private ReactRootView mReactRootView;
+
+ private Context mContext;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ if (mContext == null) {
+ mContext = context;
+ }
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EventBus.getDefault().register(this);
+ }
+
+ @SuppressLint("InflateParams")
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ root = inflater.inflate(R.layout.home_fragment, null);
+ root.findViewById(R.id.open_meituan_text_view).setOnClickListener(l);
+ root.findViewById(R.id.event_bus_sender_text_view).setOnClickListener(l);
+ eventBusFlagText = root.findViewById(R.id.event_bus_flag_text_view);
+ root.findViewById(R.id.event_bus_sender_text_view).setOnClickListener(l);
+ root.findViewById(R.id.send_to_js_text_view).setOnClickListener(l);
+ initReactRootView(root);
+ return root;
+ }
+
+ private void initReactRootView(View view) {
+ mReactRootView = new ReactRootView(mContext);
+
+ // The string here (e.g. "MyReactNativeApp") has to match
+ // the string in AppRegistry.registerComponent() in index.js
+ mReactRootView.startReactApplication(HomeReactInstanceManager.newInstance().getReactInstanceManager(), "MeiTuan", null);
+
+ LinearLayout homeReactRootView = view.findViewById(R.id.home_react_view);
+ if (homeReactRootView.indexOfChild(mReactRootView) == -1) {
+ (homeReactRootView).addView(mReactRootView, 0);
+ }
+ }
+
+ private View.OnClickListener l = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.open_meituan_text_view:
+ startActivity(new Intent(getActivity(), MainActivity.class));
+ break;
+ case R.id.event_bus_sender_text_view:
+ EventBus.getDefault().post(new HomeEvent());
+ EventBus.getDefault().post(new HomeEvent(Constants.HOME_FRAGMENT_SENDER_REFRESH));
+ EventBus.getDefault().post(new HomeEvent(Constants.HOME_FRAGMENT_SENDER_COMPLEX, new HomeEvent()));
+ break;
+ case R.id.send_to_js_text_view:
+// WritableMap params = Arguments.createMap();
+// params.putString("eventProperty", "someValue");
+// String eventName = "EventReminder";
+ HomeMessageEventModule.newInstance().putEventName("EventReminder").putParam("eventProperty", "someValue").sendEventToJs();
+ }
+ }
+ };
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onReceiveRefreshEvent(BaseEvent baseEvent) {
+ switch (baseEvent.getEventType()) {
+ case Constants.HOME_FRAGMENT_SENDER_REFRESH:
+ Toast.makeText(getActivity(), "刷新就刷新", Toast.LENGTH_LONG).show();
+ break;
+ case Constants.HOME_FRAGMENT_SENDER_COMPLEX:
+ eventBusFlagText.setText("复杂点儿");
+ Toast.makeText(getActivity(), "复杂点儿", Toast.LENGTH_LONG).show();
+ break;
+ default:
+ Toast.makeText(getActivity(), "我就想验证下EventBus", Toast.LENGTH_LONG).show();
+ break;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ EventBus.getDefault().unregister(this);
+
+ if (mReactRootView != null) {
+ mReactRootView.unmountReactApplication();
+ }
+ }
}
diff --git a/android/app/src/main/res/layout/home_fragment.xml b/android/app/src/main/res/layout/home_fragment.xml
index 42d61a8..9144095 100644
--- a/android/app/src/main/res/layout/home_fragment.xml
+++ b/android/app/src/main/res/layout/home_fragment.xml
@@ -49,6 +49,17 @@
android:text="EventBus标记"
android:textColor="@android:color/holo_blue_dark" />
+
+
+
{
}
}
+ componentDidMount() {
+ const eventEmitter = new NativeEventEmitter(NativeModules.ToastExample)
+ eventEmitter.addListener('EventReminder', (event) => {
+ // console.log(event.eventProperty) // "someValue"
+ alert(event.eventProperty)
+ })
+ }
+
onHeaderRefresh() {
this.setState({isRefreshing: true})