用于 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 盒子

Xamarin.Android 无法在 Android 10 (Q) 中将录制的自定义声音用于推送通知

FFMPEG 命令不适用于 Android 10

媒体查询不适用于 Android

用于菜单的 Android 库