用于 android 的 cordova/phongap 流星构建中的后退按钮不会始终关闭应用程序
Posted
技术标签:
【中文标题】用于 android 的 cordova/phongap 流星构建中的后退按钮不会始终关闭应用程序【英文标题】:back button in cordova/phongap meteor build for android won't close application consistently 【发布时间】:2015-03-19 07:12:51 【问题描述】:我已经使用流星和 phonegap/cordova 为 android 构建了应用程序: https://play.google.com/store/apps/details?id=com.idqkd3gsl4qt51152xgy
它工作得很好(特别是考虑到我并不是真正的程序员),但我一直在努力解决的一个用户体验问题是,当我按下手机上的后退按钮时,应用程序不会始终关闭。每隔一段时间,它会在第一次按下时起作用,但大多数时候我必须连续堵塞它 5-6 次才能关闭应用程序。
我正在使用最新的铁路由器。我使用的其他软件包似乎与这个问题并不特别相关,但它们如下以防万一:
标准应用程序包 咖啡脚本 natestrauser:font-awesome@4.1.0 帐户密码 aldeed:autoform aldeed:collection2 nemo64:引导程序 较少的 艾伦宁:角色 joshowens:accounts-entry mrt:accounts-admin-ui-bootstrap-3 mizzao:jquery-ui 铁:路由器 萨沙:自旋 raix:推 mizzao:bootboxjs 流星黑客:卡迪拉 bootstrap3-媒体查询
repo 可以在这里看到:https://github.com/The3vilMonkey/BrewsOnTap
【问题讨论】:
【参考方案1】:我无法指定此问题的确切原因,除了在启动时似乎 Cordova 应用程序发生了某种重定向。我发现的最佳解决方案是捕获 popstate 事件,当您返回开始退出或暂停应用程序时。我更喜欢暂停这种方式,当用户返回应用程序时,它不会从头开始它的生命周期.
if(Meteor.isCordova)
Meteor.startup(function()
window.onpopstate = function ()
if (history.state && history.state.initial === true)
navigator.app.exitApp();
//or to suspend meteor add cordova:org.android.tools.suspend@0.1.2
//window.plugins.Suspend.suspendApp();
;
);
我第一次使用此方法时需要注意的一个问题是,如果用户未登录,则会重定向到登录页面。如果您在执行此操作的应用程序中使用此方法,则需要切换到呈现登录页面而不是重定向,否则您的应用将立即退出/暂停。
【讨论】:
我还不知道这是针对我的具体问题的答案(我会更新),但这个答案肯定满足我提出的一般问题,所以我已将其标记为正确 在下面添加了对我有用的解决方案。如果你能看一眼,看看是否有任何我没有看到的明显问题,我会很高兴。还是给了你50分【参考方案2】:在我的情况下,我混合了前面的两个答案,以便它运作良好。
document.addEventListener("backbutton", function()
if (history.state && history.state.initial === true)
navigator.app.exitApp();
else
history.go(-1);
);
【讨论】:
【参考方案3】:虽然凯利的回答确实有效,但对于我的特殊情况,它最终在功能上并不正确。关于该解决方案需要注意的重要一点是,它会在后退按钮导致您返回初始页面时立即退出,而不是在您在初始页面上按下后退按钮时退出。
最终我使用了cordova的后退按钮监听器来查看后退按钮是否被按下:
if Meteor.isCordova
Meteor.startup ->
document.addEventListener("backbutton", ->
if document.location.pathname is "/"
navigator.app.exitApp()
else
history.go(-1)
然后,如果我在我的应用程序的根目录中,我将退出/挂起,否则我只是返回历史记录。
使用后退按钮事件侦听器似乎会覆盖它的默认功能,因此在我的情况下调用 history.go(-1) 是必要的。
另请注意,如果您想要一个真实的历史记录,该历史记录可以在初始入口点存在之前回溯到历史记录(可能多次触及应用程序的根目录),则此解决方案将中断。我的答案和凯利的答案相结合可能会起作用。我发现虽然这可能是网站的预期行为,但对于移动应用程序来说并非如此。
【讨论】:
【参考方案4】:这里有一个流星包也可以为您执行此操作:
https://github.com/remcoder/fix-back-button-android
编辑: 实际上,我继续分叉了那个 repo,修复了 cordova 插件依赖问题,并使用了 Kelly 的代码而不是原始 repo 中的代码,在这里找到我的 fork: https://github.com/tripflex/fix-back-button-android
或者安装在 Meteor 中使用:
meteor add tripflex:fix-back-button-android
当通过下面描述的 GitHub 方法添加并使用 Kelly 的答案检测根页面时,我可以确认它正常工作(不要使用 GitHub 存储库上的示例)。
我也不是流星专家(但我是一名全职开发人员),但根据 Kelly 的回答,我会在 Meteor Startup 中移动isCordova
的检查(因为我相信你会有更多随着您的应用程序的进展启动代码)
Meteor.startup(function()
// Mobile specific code
if(Meteor.isCordova)
window.onpopstate = function ()
if (history.state && history.state.initial === true)
navigator.app.exitApp();
//or to suspend meteor add cordova:org.android.tools.suspend@0.1.2
//window.plugins.Suspend.suspendApp();
;
// Any other startup code below here
);
编辑:如果您决定要使用 cordova 挂起包,它不会像 Meteor 中的大多数 cordova 插件一样工作,因为该插件在 npm 中不存在,所以这不起作用:
meteor add cordova:org.android.tools.suspend@0.1.2
您必须像这样使用 GitHub 存储库添加它:
meteor add cordova:org.android.tools.suspend@https://github.com/Lamerchun/org.android.tools.suspend.git#0dbb52cca0244ba22a8c7975895f0f45d2e9a4a9
【讨论】:
以上是关于用于 android 的 cordova/phongap 流星构建中的后退按钮不会始终关闭应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Android 蓝牙发现 API 不适用于 Android 6.0
用于调试 android TV 应用程序的 Android 盒子