从网页监听Android设备的返回键

摘要:
最近,在开发Android项目时,我遇到了一个相当痛苦的需求。我需要从ClientApp调用系统浏览器来打开页面,进行一些杂项交互,然后返回应用程序。这个需求之所以令人痛苦,是因为Android有一个物理返回键……用户按下返回键后,预计将与单击页面上的返回键相同——返回应用程序。

最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App。如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流。

之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊……

用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App。然而这个返回键的被按下的时候网页完全不知道啊(onbeforeunload不算),找不到直接的办法去监听,愁死我们这全苦逼程序员鸟~

虽然啊不能直接监听,曲线救国的办法,还是有滴。

经过艰苦卓绝的寻找,发现使用HTML5的History可以稍微模拟到返回键的按下事件。原理如下:

  1. 页面加载完成时,调用history.pushState写入一个指定状态STATE,并监听window.onpopstate;
  2. 当onpopstate被触发时,检查event.state是否等于STATE,如果相等,表示页面发生了后退(按下返回键或者浏览器的后退按钮),则把这次行为当作是返回键被按下了(把点击浏览器的后退按钮也误算进来了,不过没啥好法子了呀)。

嗯,为了方便调用,把这个逻辑稍微封装了下,代码见这里(https://github.com/iazrael/xback),使用方法如下:

XBack.listen(function(){
    alert('oh! you press the back button');
});

XBack.listen(function(){
    alert('ah, press press press');
});

不过这个方法有些缺陷:

  1. 如果项目本身使用了pushState,则历史记录会有瑕疵(多了一个历史);
  2. 浏览器的后退按钮点击以及调用history.back()也会被当成按下了返回键。

But anyway,对于结构和逻辑比较简单的跳转页来说(就是为了返回App用的),这个方法还是蛮实用的,对不对?嘻嘻~

免责声明:文章转载自《从网页监听Android设备的返回键》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OUT 了??还没玩转报表超链接go get下载慢、安装goland下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

uniApp之 顶部选项卡

想做一个像uniapp插件里资讯应用模板那样的功能,用了官方组件swiper,一开始不能滚动,后来看了官网,说要加scroll-view 这个标签才可以 第一次用uniapp做app做个笔记吧 首先先做个顶部的tab选项卡,因为我只有两项 所以就直接写在view标签里了 <view class="navs"> <v...

Navicat破解方法(仅供学习)

最近在学习PHP,MySQL,CMS,想要快速做一个个人站或者企业站这种; 因此学习路线实际是从CMS再到MySQL的; 但是MySQL是没有图形化界面的,对于博主这种菜鸟,感觉不太习惯; 因此去网上找了鼎鼎大名的Navicat,但是苦于这是个收费软件,不大利于长期学习; So,找了一个非常好用的科学使用方法: 原文地址:https://defcon.cn...

Altium Designer PCB制作入门实例

概要:本章旨在说明如何生成电路原理图、把设计信息更新到PCB文件中以及在PCB中布线和生成器件输出文件。并且介绍了工程和集成库的概念以及提供了3D PCB开发环境的简要说明。欢迎使用Altium Designer,这是一个完善的适应电子产品发展的开发软件。本章将以"非稳态多谐振荡器"为例,介绍如何创建一个PCB工程。 Contents 创建一个新的PCB...

【开发工具】OpenLive使用总结

一、OpenLive软件安装 ①下载地址 http://openlivewriter.org/ ②安装 (基本上下一步就行) 二、使用SyntaxHighlighter实现代码高亮 ①下载插件 https://files-cdn.cnblogs.com/files/memento/Memento.OLW_V1.0.0.0.7z ②将解压后的两个dll...

使用代理软件之后其他软件不能联网的解决方法

其实我很久之前就遇到了这个问题,不过一直不知道什么原因,刚才突然发现了原因,从而很简单就解决了问题,所以说有时候发现问题比解决问题更为重要 使用代理软件,我们很多时候不注意,没有正常关闭这个代理软件,或者说有时候因为断电还是什么其他原因,没有正常关闭,或者说有时候正常关闭之后还是没有修改局域网代理方式,从而导致其他的一些软件不能正常联网,比如我最开始的时候...

Visual C++ 6.0编程环境的使用

1.1 编制并运行程序的四部曲 (1)编辑(把程序代码输入,交给计算机)。 (2)编译(成目标程序文件.obj)。编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行...