
基本接口
利用RN 针对Android平台提供的接口 BackHandler

 BackHandler需要区分类组件跟函数组件的场景,主要是两个组件一个基于组件生命周期的,一个是基于hook的,即注册BackHandler的事件监听与移除时机写法不同。
类组件
示例代码
import React, { Component } from 'react';  
import { BackHandler, Alert } from 'react-native';  class MyComponent extends Component {  constructor(props) {  super(props);  // 订阅返回事件  this.backHandler = BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);  }  componentWillUnmount() {  // 组件卸载时移除监听  this.backHandler.remove();  }  handleBackPress = () => {  // 自定义返回逻辑  // 例如:弹出确认框  Alert.alert(  '退出应用',  '确定要退出吗?',  [  {text: '取消', onPress: () => console.log('取消返回'), style: 'cancel'},  {text: '确定', onPress: () => BackHandler.exitApp()},  ],  { cancelable: false }  );  // 返回true表示阻止默认返回行为  return true;  }  render() {  // 渲染组件内容  return (  // ...组件内容  );  }  
}  export default MyComponent;
函数式组件
import React, { useEffect } from 'react';  
import { BackHandler, Alert } from 'react-native';  const MyComponent = () => {  useEffect(() => {  const backHandler = BackHandler.addEventListener('hardwareBackPress', handleBackPress);  return () => {  // 清除事件监听器  backHandler.remove();  };  }, []); // 注意,这里的依赖数组为空,意味着只在组件挂载和卸载时执行  const handleBackPress = () => {  // 自定义返回逻辑  Alert.alert(  '退出应用',  '确定要退出吗?',  [  {text: '取消', onPress: () => console.log('取消返回'), style: 'cancel'},  {text: '确定', onPress: () => BackHandler.exitApp()},  ],  { cancelable: false }  );  return true;  }  return (  // ...组件内容  );  
};  export default MyComponent;
Hook
hook即针对于函数组件
 我们需要引入 https://github.com/react-native-community/hooks#usebackhandler 库
yarn add @react-native-community/hooks
示例代码如下:
import {useBackHandler} from '@react-native-community/hooks'useBackHandler(() => {if (shouldBeHandledHere) {// handle itreturn true}// let the default thing happenreturn false
})
Navigation
如果使用Navigation库的话,还有可以使用其提供的自定义后退按钮事件的处理 (也是针对函数式组件的)
 https://reactnavigation.org/docs/custom-android-back-button-handling/
 
总结
结合函数式组件越来越流行的趋势,个人推荐使用 usebackhandler hook!