混合开发技巧之H5拦截原生返回事件

在混合开发的场景中,有时需要把原生的返回事件交由H5进行处理,让H5去做一些操作:如点击原生返回时,h5要进行弹框提示或者进行一些数据保存。那么如何去做?

H5端实现,以Vue为例:

第1步:在mounted()中需要给页面挂载js方法,如下

 mounted() {
    
    

        /**

         * 如果需要拦截原生的返回事件,需要挂载js方法(方法名任意).

         * 该方法返回true代表H5拦截处理,见第2步.

         */

        window.NativeBackListener = this.NativeBackListener;

    },

第2步:在methods中添加要挂在的js方法

methods:{
    
    

     NativeBackListener() {
    
    

            this.handleNativeBack();//自定义方法,可以在该方法中进行场景处理。

            return true;//这个true可以代表该H5页面要拦截原生的返回事件进行处理

        },

      handleNativeBack(){
    
    

       //....进行场景处理

      }

 }     

原生实现,以Android为例:

Android的原生返回可以通过手势(物理返回)或者点击返回箭头进行返回。处理时其实没差别,我们可以进行拦截让webview执行上面定义的NativeBackListener 方法,并根据回调结果进行判断该H5是否拦截原生的返回事件,从而进行相应的处理。

如物理处理时,重写onKeyDown方法

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {
    
    

    if (keyCode == KeyEvent.KEYCODE_BACK) {
    
    

        webContainer.evaluateJavascript("javascript:NativeBackListener()", new ValueCallback<String>() {
    
    

            @Override

            public void onReceiveValue(String value) {
    
    

                if ("false".equals(value) || "null".equals(value)) {
    
    

                    finish();//h5页面不进行拦截,finish当前页

                } else if ("true".equals(value)) {
    
    

                    // h5进行拦截了,就不能finish当前页

                }

            }

        });

    }

    return true;

}

经测试发现,采用这种实现方式时,如果H5页面加载失败,不影响原生的返回功能。

猜你喜欢

转载自blog.csdn.net/qq_36162336/article/details/115555489
今日推荐