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})