【问题标题】:Launching Dialog from Service从服务启动对话框
【发布时间】:2011-12-02 00:37:44
【问题描述】:

我想从悬停在用户当前正在查看的任何内容上的服务中启动一个对话框。对话框像这样启动:服务触发打开对话框>启动透明活动>透明活动显示对话框。

我的问题是当用户打开应用程序,启动到主菜单,然后按 HOME 离开。通过按 HOME,它会暂停主菜单活动,而不是破坏,当服务启动对话框时,主菜单会显示在透明活动下方;导致对话框失去悬停在用户正在查看的任何内容上的影响。

如何使透明 Activity 独立于应用程序中的任何其他 Activity 打开?目前防止这种情况发生的唯一方法是在所有活动暂停时完成它们;但这是不切实际的。

【问题讨论】:

标签: android service android-activity dialog


【解决方案1】:

This 是我们最不想要的。 :-)

1.来自服务的对话框

移动设备(恕我直言,尤其是 Android)的最佳体验之一是,几十年后,我们摆脱了系统范围内令人讨厌的警报对话框。最后,用户交互的最佳实践 [1, 2] 为我们提供了一种避免 MessageBox(hwnd, lpText, lpCaption, uType) 的臭名昭著的传播使用,争夺焦点和可怜用户的注意力的方法。请参阅上面的视频模仿。

Service 开始对话感觉很尴尬的原因正是因为它应该是后台任务,没有用户交互。从概念上讲,您不应该这样做。这就是为什么我们首先看到这些技巧(透明活动,多么愚蠢的事情)来欺骗设计指南的原因。它们很糟糕,它们破坏了用户体验,它们窃取了焦点和注意力。他们扰乱了我们的工作。

2。改用通知

当您想从后台通知用户某事时,当用户在其他地方时,您可以使用通知。这是默认模式,不会打扰用户。

因此,您应该是sending notifications from your Service

从那里,如果用户感兴趣,然后他会触摸通知,然后你开始你自己的活动,可能会恢复你的活动,创建一个新活动,然后使用一个对话框请求操作被执行,或者你想做的任何事情。

3.最后,NOT 使用FLAG_ACTIVITY_MULTIPLE_TASK

You should not永远,除非您已仔细阅读并完全理解 documentation 以及使用该标志的含义,否则请使用此标志。

除非您正在实现自己的顶级应用程序启动器,否则请勿使用此标志。 (...) 因为默认系统不包括图形任务管理,所以除非您提供某种方式让用户返回到您已启动的任务,否则不应使用此标志。

真的。在这种情况下,请不要这样做。

【讨论】:

  • 感谢大卫的洞察力,你的第一点和第二点很好,我同意他们,但我在问题中描述的情况实际上并不是我的真实情况。我只是将其缩减为我需要传达的内容;该服务确实只是无中生有地显示对话框,它是根据用户请求发生的。我尽我所知阅读并理解了FLAG_ACTIVITY_MULTIPLE_TASK 所做的事情,并且我已经实现了文档所述的条件。我已经控制住了,谢谢!
  • 没关系。无论如何,我也为谷歌人回答了,因为你的回答对于那些不理解它的人来说确实是不合适的。当您刚刚承认对真实场景还有其他影响时,这个标志似乎就是答案。因此,我的评论。
  • 关于标志本身,基本上你需要为用户提供一种导航回活动的方式,这意味着你要么创建自己的启动器,要么实现低级活动/任务跟踪器您可以稍后使用以将它们再次带到前台(在极少数情况下,您不会:拨号器)。当用户按下主页按钮而不按照您的想法遵循您的代码逻辑时,就会产生影响。但是,如果您说您理解,那对我来说很好,因为您是评估这种需求的最佳人选。祝你好运!
  • 非常感谢您的澄清!很高兴您有时间向我充分解释这一点。
  • @XO。作为个人意见,我不喜欢聊天头正是因为这个原因,更何况现在我们有直接回复和通知捆绑(除了 事实 它可以并且在过去,导致应用程序争夺注意力,正如上面滑稽地展示的那样)。但我同意这也属于意见的范畴,说“你的里程可能会有所不同”,因为我可以理解为什么有人希望他们的联系人继续出现在他们可能是的任何其他人面前用他们的手机做。这取决于您的优先事项以及您希望如何与他们互动。不过,不是我的那杯茶。
【解决方案2】:

您可以考虑将 alertDialog 与TYPE_SYSTEM_ALERT 一起使用而不是活动:

AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setTitle("Title")
                    .setMessage("Are you sure?")
                    .create();

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();

请注意,您必须使用以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

【讨论】:

  • 拯救了我的一天。谢谢
【解决方案3】:

这是我自己发现的,只需在启动 Intent 中添加 Intent.FLAG_ACTIVITY_MULTIPLE_TASK 标志即可;当然与Intent.FLAG_ACTIVITY_NEW_TASK 标志一起使用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多