1. 程式人生 > >react native安卓除錯(搖一搖和選單鍵無效)

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的生命週期有關係。