react native 原生页面跳转到React页面,react页面回退到原生页面实现。

1.最新实现方式,只要继承ReactActivity,重写getMainComponentName()方法。内部已实现。

2.以前实现方式,实现DefaultHardwareBackBtnHandler接口,在ReactInstanceManager 设置DefaultHardwareBackBtnHandler为当前activity即可。

具体代码:

public class TestRNActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler, PermissionAwareActivity {

    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;
    private @Nullable
    PermissionListener mPermissionListener;
    private @Nullable
    com.facebook.react.bridge.Callback mPermissionsCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String filePath = getIntent().getStringExtra("filePath");
        initReactRootView(true,filePath);
    }

    private void initReactRootView(boolean isRelease, String filePath) {
        // 发布版加载本地文件,测试架子啊assent目录下文件
        File file = new File(filePath);
           if (isRelease) {
            mReactInstanceManager = ReactInstanceManager.builder()
                    .setCurrentActivity(this)
                    .setApplication(getApplication())
                    .setJSMainModulePath("index.android")
                    .addPackages(Arrays.<ReactPackage>asList(
                            new MainReactPackage()
                       
                    ))
                   //设置监听为当前activity
                   .setDefaultHardwareBackBtnHandler(this)
                    .setInitialLifecycleState(LifecycleState.RESUMED)
                    .setJSBundleFile(filePath)
                    .build();

        } else {//测试模式,加载assent目录下的
            mReactInstanceManager = ReactInstanceManager.builder()
                    .setCurrentActivity(this)
                    .setApplication(getApplication())
                    .setJSMainModulePath("index.android")
                    .addPackages(Arrays.<ReactPackage>asList(
                            new MainReactPackage()
                    ))
                    .setUseDeveloperSupport(BuildConfig.DEBUG)
                    .setInitialLifecycleState(LifecycleState.RESUMED)
                    .setBundleAssetName("index.android.bundle")
                    .build();
        }
        mReactRootView = new ReactRootView(this);
        //传参
//        var  initProps = this.props.bundle; 获取参数
        Bundle bundle = new Bundle();
        bundle.putString("bundle", "首次进入参数");
        mReactRootView.startReactApplication(mReactInstanceManager, getIntent().getStringExtra("INDEX"), bundle);
        setContentView(mReactRootView);
        // 运行中重新加载bundle文件
//        mReactInstanceManager.recreateReactContextInBackground();
    }
    //

   
   //此方法监听js端,在顶部页面时调用原生返回方法
    @Override
    public void invokeDefaultOnBackPressed() {
        super.onBackPressed();

    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this);
        }
        if (mPermissionsCallback != null) {
            mPermissionsCallback.invoke();
            mPermissionsCallback = null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mReactRootView != null) {
            mReactRootView.unmountReactApplication();
            mReactRootView = null;
        }
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy(this);
        }

    }


 


    //物理返回事件传递
    @Override
    public void onBackPressed() {
   
       if (mReactInstanceManager != null) {
           mReactInstanceManager.onBackPressed();
        }else{
            super.onBackPressed();
       }
    }


    // 开发者模式
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (mReactInstanceManager != null &&
                mReactInstanceManager.getDevSupportManager().getDevSupportEnabled()) {
            if (keyCode == KeyEvent.KEYCODE_MENU) {
                mReactInstanceManager.showDevOptionsDialog();
                return true;
            }
        }
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onActivityResult(this, requestCode, resultCode, data);
        }
    }


    @Override
    protected void onNewIntent(Intent intent) {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onNewIntent(intent);
        }
        super.onNewIntent(intent);
    }


    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        if (mReactInstanceManager != null
                && mReactInstanceManager.getDevSupportManager().getDevSupportEnabled()
                && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) {
            mReactInstanceManager.showDevOptionsDialog();
            return true;
        }
        return false;
    }

    /**
     * 权限动态申请
     *
     * @param permissions
     * @param requestCode
     * @param listener
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) {
        mPermissionListener = listener;
        requestPermissions(permissions, requestCode);
    }

    @Override
    public void onRequestPermissionsResult(
            final int requestCode,
            final String[] permissions,
            final int[] grantResults) {
        mPermissionsCallback = new com.facebook.react.bridge.Callback() {
            @Override
            public void invoke(Object... args) {
                if (mPermissionListener != null && mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
                    mPermissionListener = null;
                }
            }
        };
    }

}



                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流转的年华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值