react native安卓除錯(搖一搖和選單鍵無效)
一個原生的專案要求嵌入react native介面,於是我把打包好的bundle放到assets資料夾下本地載入,執行沒問題,但是沒辦法除錯,搖一搖和長按Menu鍵都不行。
檢查程式碼,主配置檔案中註冊了
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
例項化ReactInsyanceManager的時候也setUseDeveloperSupport(true)了。
進到setUseDeveloperSupport這個方法看一看:
/** * When {@code true}, developer options such as JS reloading and debugging are enabled. * Note you still have to call {@link #showDevOptionsDialog} to show the dev menu, * e.g. when the device Menu button is pressed. */ public ReactInstanceManagerBuilder setUseDeveloperSupport(boolean useDeveloperSupport) { mUseDeveloperSupport = useDeveloperSupport; return this; }
註釋裡說了,引數為true時可以debug。然後還需要呼叫showDevOptionsDialog。
好的,呼叫這個喚起debug選單的showDevOptionsDialog方法,依然沒反應。上網找答案,原來例項化ReactInsyanceManager的時候還需要setCurrentActivity(this)。
所以,最終方案:
1.ReactInsyanceManager使用Builder例項化時setCurrentActivity(this).
2.監聽選單鍵:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU){ openDevDialog(); }else { return super.onKeyDown(keyCode, event); } return true; } private void openDevDialog() { manager.showDevOptionsDialog(); }
如此操作後當前activity就可以長按選單鍵喚出debug選單了,不過別的activity還需要相同的操作才能支援debug。
優化:
在一個專案裡有時不止一個RN介面,按照上面的方案想要除錯所有介面的話每個介面都需要例項化一個ReactInsyanceManager,這樣造成了浪費,降低了頁面顯示的速度。還好RN官方是有方案的,manager.onHostResume即可設定currentActivity。這樣我們就可以複用一個ReactInsyanceManager例項,只需要每個頁面呼叫一次onHostResume就可以了
emmm ,我發現aty和manager繫結生命週期之後就可以搖一搖了。。。。。。看來這個搖一搖註冊和manager的生命週期有關係。