【问题标题】:Regaining control in codename one app after delegating to native app委托给原生应用程序后重新获得代号为一个应用程序的控制权
【发布时间】:2017-05-17 13:24:58
【问题描述】:

我正在将代号为 one 的应用程序委托给本机电子邮件应用程序。我期待这个调用将代号一个应用程序发送到后台,或者至少停止进一步的代码执行,直到控制被恢复,但是这没有发生。没有调用生命周期方法 ( s​​top/start ),并且仍在执行委托之后的代码。

我想在用户完成电子邮件应用程序之前停止代号一应用程序中的所有执行,然后在代号一应用程序重新获得控制权时以某种方式得到通知。

我确信应该有一种简单直接的方法来做到这一点,但是我找不到它。

请帮忙!

如果可能,我不希望强制应用最小化。

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    stop()start() 在移动到其他应用程序时应该被调用,但它们将在 EDT 上异步调用,因此假设您的代码看起来像这样的伪代码:

    callNativeEmailApp();
    doSomeStuff();
    

    然后doSomeStuff() 将立即发生,stop() 将不会被调用,因为它仍在 EDT 线程上等待。你可以给stop()一个被调用的机会:

    callNativeEmailApp();
    Display.getInstance().callSerially(() -> doSomeStuff());
    

    但这可能会有问题,因为它依赖于较小的平台行为,启动电子邮件应用程序可能需要一段时间,并且只有在电子邮件应用程序获得控制权时才会调用 stop()

    更好的方法是这样做:

    setFlagThatWeShouldBeInEmailApp();
    callNativeEmailApp();
    

    然后在stop()start() 中,您可以测试这些标志并在那里编写逻辑。请注意,这是“脆弱的”,因为您需要处理崩溃或取消的情况。

    【讨论】:

    • 实际上,这很奇怪,因为我在本机电子邮件应用程序委托之后删除了所有代码,但没有调用 stop() 和 start()。电子邮件应用程序打开,但当返回代号为 one 的应用程序时,它的行为就像什么都没发生一样。这是预期的行为吗?是否保证应用程序在委托给本机应用程序期间处于休眠状态?我正在使用 Android 6.0.1 的 Lenove K6 Note 上测试该应用程序。
    • 在这种情况下应该保证stop() & start() 被调用。我建议使用日志记录来验证是否确实如此。请注意start() 方法开头的代码可能会破坏您的应用程序逻辑,因为它将显示最后一个活动表单。您需要小心这种行为。
    • 如果我手动最小化应用程序,将调用 stop()/start() 并且应用程序成功恢复。但是,在委派给本机电子邮件应用程序之后,没有迹象表明代号一个应用程序正在进入睡眠状态。我很确定它不会通过 stop()/start() 循环。这可能是一个错误,还是我使用的电话/平台/代码组合导致了一些奇怪的行为?
    • 这可能是一个错误,也可能是我们没有解决方法的平台“不当行为”。问题是这些行为是出了名的难以调试,所以如果你有一种解决方法,我建议你采用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多