React Native之hardwareBackPress
发布日期:2021-06-29 14:12:58 浏览次数:2 分类:技术文章

本文共 6079 字,大约阅读时间需要 20 分钟。

1  hardwareBackPress

我们用hardwareBackPress来监听手机物理返回键

 

 

 

 

2 js那边常用写法

BackHandler.addEventListener('hardwareBackPress', this._back);

 

 

 

3  我们看下Android源代码分析是怎么触发到这里来的

1) ReactActivity.java里面的部分代码如下

@Override  public void onBackPressed() {    if (!mDelegate.onBackPressed()) {      super.onBackPressed();    }  }

2 ) 进入onBackPressed()函数看看,在ReactActivityDelegate.java文件里面

public boolean onBackPressed() {    if (getReactNativeHost().hasInstance()) {      getReactNativeHost().getReactInstanceManager().onBackPressed();      return true;    }    return false;  }

3)再次点击onBackPressed函数进去看下

public void onBackPressed() {    UiThreadUtil.assertOnUiThread();    ReactContext reactContext = mCurrentReactContext;    if (reactContext == null) {      // Invoke without round trip to JS.      FLog.w(ReactConstants.TAG, "Instance detached from instance manager");      invokeDefaultOnBackPressed();    } else {      DeviceEventManagerModule deviceEventManagerModule =        reactContext.getNativeModule(DeviceEventManagerModule.class);      deviceEventManagerModule.emitHardwareBackPressed();    }  }

4) 进到emitHardwareBackPressed函数里面看下

/**   * Sends an event to the JS instance that the hardware back has been pressed.   */  public void emitHardwareBackPressed() {    getReactApplicationContext()        .getJSModule(RCTDeviceEventEmitter.class)        .emit("hardwareBackPress", null);  }

这里发现了Android原生向js发送了消息,所以我们监听hardwareBackPress就有反映

 

 

 

 

 

 

4 测试代码如下

App.js文件如下

import React from 'react';import { View, Text, Button, NativeModules, BackHandler} from 'react-native';import { createStackNavigator } from 'react-navigation';var toast = NativeModules.MyToast;class HomeScreen extends React.Component {   constructor(props) {	super(props);	console.log("HomeScreen constructor start");    }    static navigationOptions = {        title : 'HomeScreen',    }	    componentDidMount = () => {        this.didFocusListener = this.props.navigation.addListener(		'didFocus',		(obj) => {			console.log("HomeScreen didFocus start");			BackHandler.addEventListener('hardwareBackPress', this._back);					}	);	this.didBlurListener = this.props.navigation.addListener(		'didBlur',		(obj) => {console.log('HomeScreen didBlur start')}		);                console.log("HomeScreen componentDidMount start")    }    componentWillUnmount() {		console.log("HomeScreen componentWillUnmount start")		this.didFocusListener.remove();		this.didBlurListener.remove();    }            render() {		var testID = 'chenyu';        return (            
this._goto()}>Home Screen

 

 

 

 

 

 

5 运行结果

点击主界面的GO TO DETAILS,进入详细页面,然后分别按下2次back键,日志如下

10-27 23:39:32.498   917  1031 I ReactNativeJS: detail back10-27 23:39:32.498   917  1031 I ReactNativeJS: home back10-27 23:39:32.784   917  1031 I ReactNativeJS: DetailsScreen componentWillUnmount start10-27 23:39:32.790   917  1031 I ReactNativeJS: HomeScreen didFocus start10-27 23:39:51.164   917  1031 I ReactNativeJS: detail back10-27 23:39:51.165   917  1031 I ReactNativeJS: home back10-27 23:39:51.165   917  1031 I ReactNativeJS: detail back10-27 23:39:51.165   917  1031 I ReactNativeJS: home back10-27 23:39:51.165   917  1031 I ReactNativeJS: detail back10-27 23:39:51.165   917  1031 I ReactNativeJS: home back10-27 23:39:51.165   917  1031 I ReactNativeJS: home back10-27 23:39:51.165   917  1031 I ReactNativeJS: detail back10-27 23:39:51.166   917  1031 I ReactNativeJS: detail back10-27 23:39:51.166   917  1031 I ReactNativeJS: home back10-27 23:39:51.166   917  1031 I ReactNativeJS: detail back10-27 23:39:51.166   917  1031 I ReactNativeJS: home back10-27 23:39:51.166   917  1031 I ReactNativeJS: home back10-27 23:39:51.621   917  1031 I ReactNativeJS: HomeScreen componentWillUnmount start

我们点击标题栏的返回按钮,和点击GO BACK,执行this.props.navigation.goBack()方法,都不会触发hardwareBackPress监听所执行的函数

 

转载地址:https://chenyu.blog.csdn.net/article/details/83388372 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:React Native之react-native bundle --platform android --dev false --entry-file index.js --bundle失败
下一篇:React Native之didFocus和didBlur

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月24日 10时51分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

快速从入门到精通!面试的时候突然遇到答不上的问题怎么办?已拿到offer 2019-04-29
快速学会!连续四年百度Android岗必问面试题!终局之战 2019-04-29
想提高开发效率的必看!2021Android目前最稳定和高效的UI适配方案!大厂面经合集 2019-04-29
想转行当程序员的必看!带你快速通过字节跳动面试,Android校招面试指南 2019-04-29
我总结了24家大厂100份面试题,细数Android开发者的艰辛历程,深度解析,值得收藏 2019-04-29
最强Android教程!Android屏幕适配很难嘛?其实也就那么回事,面试真题解析 2019-04-29
最强Android教程!带着问题深入学习Handler,赶紧收藏! 2019-04-29
Android开发知识体系!腾讯+字节+阿里面经真题汇总,成功入职阿里 2019-04-29
android开发语言!大厂经典高频面试题体系化集合,移动架构师成长路线 2019-04-29
android开发面试准备!面试字节跳动Android研发岗,附赠课程+题库 2019-04-29
android性能优化简书!面试大厂应该注意哪些问题?成功入职阿里 2019-04-29
Android进阶:一起看看这些大厂面试真题查漏补缺吧,成功定级腾讯T3-2 2019-04-29
android面试准备中高级简书!组件化与插件化的差别在哪里?附带学习经验 2019-04-29
Android开发基础不牢?2021年最新Android面试点梳理,实战解析 2019-04-29
android开发实战!2021大厂Android面试经历,赶紧收藏! 2019-04-29
android开发实战!给后辈的一点建议,Android岗 2019-04-29
android开发实战!阿里P7级别面试经验总结,吐血整理 2019-04-29
Android开发必须掌握!Android开发者跳槽指南面试心得体会 2019-04-29
Android开发必须要会!分享两道阿里P7究极难度算法题,醍醐灌顶! 2019-04-29
Android开发技巧!四年Android面试遇到的问题整理,Android篇 2019-04-29