React-native在MainActivity中發送消息給前端
目前,一些App都會集成推送的功能,很多需求中需要在非Module下的文件里發送消息給前端,但是我查找了網上的資料,沒有講在MainActivity類似的文件中獲取到ReactContext的方法,固記錄下來,供大家參考。
獲取MainActivity中的ReactContext
- 1、 MainActivity 需要繼承 ReactActivty
public class MainActivity extends ReactActivity {
}
- 2、 通過獲取ReactNativeHost類去獲取ReactContext
ReactContext currentReactContext =
this.getReactNativeHost().getReactInstanceManager().getCurrentReactContext();
- 3、 通過ReactContext對象發送消息給前端
// 其中 eventName 是發送給前端的消息名稱、 msgMap 發送給前端的參數
currentReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,msgMap);
- 4、 前端接收消息
import { NativeAppEventEmitter } from 'react-native';
NativeAppEventEmitter.addListener(eventName, (msgMap) => {
// doSomeThing
});
以上四步就完成了,Android原生端發消息給react native了~
有問題,歡迎私聊or評論 指正和交流~
2020.03.08 更新
以上方法,雖然能完成Android端發送監聽消息給JS端,但是有小伙伴遇到了reactContext為null的情況,固說明下原因:
reactContext為null 是因為jsBundle沒有完成加載(即沒有完成初始化)
原理上大家可以了解下React-native的加載流程,是在我們ReactActivity里面的super.onCreate方法,通過代理類去完成jsBridge的初始化和jsBundle內容的加載,這個過程也包含ReactContext的初始化。
推送消息,點擊離線消息在App的處理方式
-
(推薦方式) 原生存儲消息,JS端主動查詢消息
這種方式比較簡單粗暴,直接將離線消息通過靜態變量、SP、Sqlite等方式存儲到本地,
添加原生獲取這些離線消息的調用方法,JS端去調用該方法獲取離線消息,在JS端做相應處理
2、 (推薦方式) 原生端設置JS端初始化配置內容(離線消息),JS端讀取初始化配置
這種方式相對正規,但是略微繁瑣,首先要在原生層面設置初始化內容,重新我們ReactActivity的createReactActivityDelegate方法,傳入一個ReactActivityDelegate對象,重寫ReactActivityDelegate對象的getLaunchOptions方法,傳入離線消息內容(bundle格式 key/value值),原生層面到此就結束了;JS端通過注冊的組件this.props. 加上你傳入的key的值獲取在bundle中放入的對應value值,最后進行相應處理
3、純原生處理,不涉及JS端
這個就不用說了,做過Android開發的都知道,通過廣播綁定的通知欄,點擊通知欄,觸發廣播攜帶消息吊起我們的Activity,通過Intent獲取離線消息內容直接處理即可
最后,還是歡迎大家一起交流Android、React Native的內容~