NT-TECHReact Native程序员

Android&ReactNative的一次亲密接触

2016-10-20  本文已影响152人  颜渃

现在越来越多的公司使用ReactNative(RN)技术,趋势还是显而易见的,作为Android开发的我,下面记录下尝试着Android与RN的一次接触吧~

创建RN工程

Getting Started

按照官方文档一步一步操作,很简单,就不重复这块了。

已有Android工程 + 植入RN页面

对于市面上大部分App来说,很多都是完整的原生工程,那么想尝试RN技术,直接的方式就是在某个页面(Activity or Fragment)里使用RN页面。

准备

环境就绪后,那么,开始。

Activity

  1. gradle里增加dependencies compile "com.facebook.react:react-native:+"
AndroidManifest.xml
  1. 新建package.json
    {
    "name": "ZmyNative",
    "version": "0.0.1",
    "private": true,
    "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
    },
    "dependencies": {
    "react": "15.3.1",
    "react-native": "0.32.1"
    }
    }
  1. 注意 Android端getMainComponentName 的返回值 与 JS端 registerComponent的第一个参数必须是一样的
  2. Android 需要手动开启悬浮窗权限
  3. 在package.json目录,执行 ** npm start**
  4. 配置本地地址


    debug.png

Fragment

  1. 新建ReactFragment
    public abstract class ReactFragment extends Fragment {
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;
    public abstract String getMainComponentName();

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mReactRootView = new ReactRootView(context);
            mReactInstanceManager = ((MainApplication)getActivity().getApplication()).getReactNativeHost().getReactInstanceManager();
    
        }
    
        @Nullable
        @Override
        public ReactRootView onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            return mReactRootView;
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mReactRootView.startReactApplication(mReactInstanceManager, getMainComponentName(), null);
        }
     }
    
  2. 新建业务Fragment (HelloFragment)

     public class HelloFragment extends ReactFragment {
        @Override
        public String getMainComponentName() {
            return "hello";
        }
     }
    
  3. 引用Fragment的Activity
    public class RnMainActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {

        private ReactInstanceManager mReactInstanceManager;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_rn_main);
            mReactInstanceManager =
                    ((MainApplication) getApplication()).getReactNativeHost().getReactInstanceManager();
    
            Fragment viewFragment = new HelloFragment();
            getSupportFragmentManager().beginTransaction().add(R.id.rn_frame_layout, viewFragment).commit();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if (mReactInstanceManager != null) {
                mReactInstanceManager.onHostPause();
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (mReactInstanceManager != null) {
                mReactInstanceManager.onHostResume(this, this);
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mReactInstanceManager != null) {
                mReactInstanceManager.onHostDestroy();
            }
        }
    
        @Override
        public void invokeDefaultOnBackPressed() {
            super.onBackPressed();
        }
     }
    

以上仅仅是实现了原生工程植入ReactNative页面,从Native->RN的跳转,后续会记录原生组件==,先到这里。

上一篇下一篇

猜你喜欢

热点阅读