一个原生的项目要求嵌入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的生命周期有关系。