react native 之 Android物理返回键

基本用法

根据文档,安卓back键的处理主要就是一个事件监听:

1 BackAndroid.addEventListener(‘hardwareBackPress‘, this.onBackPressed);
2 BackAndroid.removeEventListener(‘hardwareBackPress‘, this.onBackPressed);

starter-kit里,我们在App这一级别,实现了按back键回退导航栈的功能:

 1 class App extends React.Component {
 2   componentWillMount() {
 3     if (Platform.OS === ‘android‘) {
 4       BackAndroid.addEventListener(‘hardwareBackPress‘, this.onBackAndroid);
 5     }
 6   }
 7   componentWillUnmount() {
 8     if (Platform.OS === ‘android‘) {
 9       BackAndroid.removeEventListener(‘hardwareBackPress‘, this.onBackAndroid);
10     }
11   }
12   onBackAndroid = () => {
13     const nav = this.navigator;
14     const routers = nav.getCurrentRoutes();
15     if (routers.length > 1) {
16       nav.pop();
17       return true;
18     }
19     return false;
20   };
21   ……
22 }

注意这里为了方便后续removeEventListener,采用了用绑定this的函数属性的方法来创建回调函数,而非箭头函数或者bind(this),这一点参考之前的博文

代码中,当componentWillMount的时候挂接事件。对于应用根组件来说,这个生命周期就基本和我们应用的生命周期一致了。当back键被按下的时候,首先检查当前的导航栈,如果多余一个页面,则退回顶部的页面。

说明:BackAndroid在iOS平台下是一个空实现,所以理论上不做这个Platform.OS === ‘android‘判断也是安全的。

使用默认行为/退出应用

back键的默认行为就是退出应用了。我们通常需要判断某些条件,并最后决定是否要退出应用。上文中的例子就使用了第一种调用默认行为的方法:

如果所有事件监听函数中,没有任何一个返回真值,就会默认调用默认行为

如果你只挂接了一个监听函数,那么你的返回值就决定了是否要调用默认行为:true为不调用,false为调用

在上文代码中,我们如果导航栈多于一个页面,就不调用默认行为,而如果只有一个页面,则调用默认界面。

例子:“再按一次退出应用”

常有这种需求:按下back键以后,弹出一个toast,然后在一定时间内再按一次,才退出应用。这个代码就可以这样写:

  onBackAndroid = () => {
    if (this.lastBackPressed && this.lastBackPressed + 2000 >= Date.now()) {
      //最近2秒内按过back键,可以退出应用。
      return false;
    }
    this.lastBackPressed = Date.now();
    ToastAndroid.show(‘再按一次退出应用‘);
    return true;
  };

还有一种情况,我们在监听函数中不能决定是否要调用默认行为,要等待一个异步操作之后才调用默认行为,此时可以通过第二种办法:

使用BACKANDROID.EXITAPP()来退出应用。

例子:在退出应用之前保存数据

写法1:

  onBackAndroid = () =>{
    saveData().then(()=>{
      BackAndroid.exitApp();
    });
    return true;
  }

在监听函数中,我们开始异步事件,并直接return true。此时默认行为不会被调用。当保存完毕后,我们调用exitApp(),触发默认行为,退出应用。

写法2:

  onBackAndroid = async () =>{
    await saveData();
    BackAndroid.exitApp();
  }

这里我们用了async函数,async 函数总是返回一个Promise,Promise作为一个对象,也被认为是一个“真值”,所以这种情况下默认行为总是不会被调用。当保存完毕后,我们调用exitApp(),触发默认行为,退出应用。

根据当前界面决定作何动作

有时候我们有这样的需求:当用户处于某些界面下时,back键要做特殊的动作,如:提示用户是否要保存数据,或者解锁界面禁止back键返回等等。此时,最佳实践是在route或route中对应的Component上保存关于如何处理back键的信息:

onBackAndroid = () => {
    const nav = this.navigator;
    const routers = nav.getCurrentRoutes();
    if (routers.length > 1) {
      const top = routers[routers.length - 1];
      if (top.ignoreBack || top.component.ignoreBack){
        // 路由或组件上决定这个界面忽略back键
        return true;
      }
      const handleBack = top.handleBack || top.component.handleBack;
      if (handleBack) {
        // 路由或组件上决定这个界面自行处理back键
        return handleBack();
      }
      // 默认行为: 退出当前界面。
      nav.pop();
      return true;
    }
    return false;
  };

原文转载自:React Native中文社区

时间: 2024-10-27 07:15:40

react native 之 Android物理返回键的相关文章

H5监听Android物理返回键

问题:H5页面的返回键可以回退到指定页面,但是Android手机的物理返回键会回到上一页. 解决办法:以下代码可以实现,Android返回键时调用H5的方法(下面代码中用的是H5的GoBackUrl方法),实现跳转到指定页面. //拦截安卓回退按钮,调用H5的返回方法 history.pushState(null, null, location.href); window.addEventListener('popstate', function (event) { history.pushSt

React Native组件之BackAndroid !安卓手机的物理返回键的使用

ok!在安卓手机上,当我们用物理返回键的时候,会以一次性的将程序退出来,这样是很不好的体验,所以就需要使用RN的物理返回键组件:BackAndroid,其原理也就是 分析路由,然后pop()这样! ok!先来说下路由栈吧!,有一点计算机技术基础的同学都应该学过堆栈,其中的栈就是后入先出,也就是RN里面的push(入栈),pop(出栈)! 好的!如图所示! 1:两个路由之间的backandroid else return 直接退出应用 2:在注册组件设置backAndroid(这里注意了,在注册组

React Native For Android 架构初探

Facebook 在2015.9.15发布了 React Native for Android,把JavaScript 开发技术扩展到了Android平台.React Native 让开发者使用 JavaScript 和 React 编写应用,利用相同的核心代码就可以创建 基于Web,iOS 和 Android 平台的原生应用.本文将浅析Android React的架构及相关基础知识.环境搭建及调试相关知识参考官网文档即可,本文不再赘述. 一.React架构分析 1.层次架构: Java层:ja

js修改物理返回键功能

preventBack: function(theurl){ var pushState = window.history.pushState; //点击物理返回键时,退出到跳转定义首页 if(pushState){ window.history.pushState({a: Math.random()},'', location.href); window.addEventListener('popstate', function(){ var type = typeof(theurl); ty

【React Native开发】React Native For Android环境配置以及第一个实例

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50456967 本文出自:[江清清的博客] (一)前言 FaceBook早期开源发布了React Native For IOS,终于在2015年9月15日也发布了ReactNative for Android,虽然Android版本的项目发布比较迟,但是也没有阻挡了广大开发者的热情.可以这样讲在2015年移动平台市场上有两个方向技术研究比较火,第一种为阿里,百度,腾讯

js history对象 手机物理返回键

有兴趣的可以了解下history对象,不感兴趣也可以直接跳到手机物理返回键监听部分 ******************[history对象]有length属性,go()/back()/forward()跳转方法**************************** 我们要了解浏览器的history对象, history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起:history.length属性保存着历史记录的URL数量.初始时,该值为1.如果当前窗口先后访问了三个网址,histo

React Native嵌入Android原生应用中

开发环境准备 首先你要搭建好React Native for Android开发环境, 没有搭建好的可以参考:React Native for Android Windows环境搭建 用Android Studio新建Android原生项目 我创建了一个名叫ReactNativeDemo的原生项目. 把React Native集成到原生项目当中 利用Windows命令行在项目根目录(ReactNativeDemo文件夹)下执行下面三行命令: npm init npm install –save

工作方向转变—— React Native For Android

既然选择了北漂,如果不玩命,就被命运玩. 最近,Fackbook将自己的著名的框架React Native,宣称支持了Android了.根据公司和朋友的推荐,个人机会在2015年的剩下时间用来研究使用此框架,来完成自己的业务.希望了解熟此框架的大神给予我多多指点. 为什么要使用此框架? 下面引入自新闻报道 开源已是大势所趋,连习惯专有化的巨头也发现了它的力量.Facebook 是其中最积极之一,近几年陆续开源的项目已有 30 多个.刚刚社交巨头又在一年一度的 @Scale 大会上宣布开源原生应用

Vue-app:物理返回键设置(单击跳转/双击退出)

1.概述 实现手机物理返回键的跳转逻辑:除特殊页面(例如首页.我的等一级页面),单击跳转到前一页:一级页面(除首页)单击跳转到首页:首页单击提示“在单击一次,退出app”,单击两次退出app. 2.代码步骤 1.在main.js中 import Mui from 'vue-awesome-mui';        Vue.use(Mui); 2.在index.html中   <script>        mui.init({            keyEventBind: {