博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react native 之 Android物理返回键
阅读量:4088 次
发布时间:2019-05-25

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

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

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

在里,我们在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;  };
http://www.cnblogs.com/shaoting/p/6340998.html
你可能感兴趣的文章
linux软件安装
查看>>
<随便写>佛祖,哈哈!
查看>>
Netty源码分析第7章(编码器和写数据)---->第3节: 写buffer队列
查看>>
利用DllImport来移动文件,真快!
查看>>
C#多线程代码调试技巧
查看>>
Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写
查看>>
ELK安装与配置
查看>>
系统启动过程
查看>>
Java中使用Runtime和Process类运行外部程序
查看>>
33.Android之Fragment学习
查看>>
Codeforces 916E(思维+dfs序+线段树+LCA)
查看>>
全局变量的初始化顺序
查看>>
SpringMVC @RequestBody请求参数在postman中的请求
查看>>
Spring boot设置文件上传大小限制
查看>>
Http请求消息Request、响应消息Response
查看>>
在win10环境下安装虚拟机并运行win7系统步骤
查看>>
查看磁盘或者文件的容量
查看>>
使用Visual Studio Code创建第一个ASP.NET Core应用程序
查看>>
ubuntu16.04配置anaconda环境
查看>>
[转]LocalDB数据库修改排序规则,修复汉字变问号
查看>>