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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.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