如何从服务(Service)中显示对话框(Dialog)?

53

我已经阅读了大量关于此主题的帖子,但对我没有用(或没有我想要的效果)。

我有一个应用程序,在登录后启动后台服务(Service类的实现)。这个服务与服务器同步,如果有新订单,它就创建一个通知。

到目前为止,一切都运行良好,我有通知和Toast消息。然而,我想要一个对话框,通知用户有新订单到来。

据我所知,您可以从服务内部启动一个活动,在其中显示对话框。这样可以运行,但是该活动会在当前活动堆栈的顶部启动并显示对话框。我有一个没有附加视图的活动,它可以正确地显示对话框,但是在黑色背景上。

我想在当前活动上显示对话框,导致实际的背景(正在运行的活动)变暗并显示对话框。 这有可能吗?


可能是来自Android服务的警报对话框的重复问题。 - araks
5个回答

119

只有当它是系统警报对话框时,我们才可以从服务中显示对话框。因此,请将TYPE_SYSTEM_ALERT窗口布局参数设置为对话框,如下所示:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

但是,它需要SYSTEM_ALERT_WINDOW权限。因此,在清单文件中不要忘记添加此权限。

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

编辑: 更好的显示对话框的选项是通过以下方式之一启动活动。

  1. 使用对话框主题启动Activity(android:theme =“@ android:style / Theme.Dialog”) -(或者)
  2. 启动半透明Activity并在其中显示对话框。

注意:您应该将Intent.FLAG_ACTIVITY_NEW_TASK添加到意图中。


11
这不应该是被接受的答案。警示对话框仅用于警示!它将置于所有内容的顶部,即使是例如电话呼叫和电池状态更改对话框也是如此。如果使用param system_alert,请注意你要做什么。 - JacksOnF1re
28
@JacksOnF1re,这应该被接受作为答案,因为它回答了问题。其他的都不重要。 - deej
14
你是否想要糟糕的程序员?因为这就是你得到糟糕程序员的方式。“无他,唯手熟尔”,这种态度是导致StackOverflow越来越像一个抄袭代码示例网站的原因。难过,但却是事实。 - JacksOnF1re
7
@JacksOnF1re不同意。没有人限制你解释为什么某些事情是不好的,但这应该只是一个附注。首先回答问题,然后解释为什么这是一个不好的做法,因为这样和那样等等。目前的答案提供了一个解决方法,而且更好的是不需要额外的权限。即便如此,我认为先回答问题会更好。 - deej
3
好的,我们不要再争论这个问题了。如果你知道自己在做什么,就一切都好了。也许这个侧面说明就足够了,我的反应可能有点过激了。 - JacksOnF1re
显示剩余9条评论

47

我非常、非常、非常强烈建议你不要这样做(这违背了Android的设计和UI准则)。通知是完成你已经完成的内容的首选方法。

话虽如此,如果你必须这样做,我建议只使用一个对话框主题活动。这样你就不必启动一个单独的对话框。请参见http://developer.android.com/guide/topics/ui/themes.html#ApplyATheme以了解如何实现。


2
我不确定那是如何处理的。你可以随时在 Stack Overflow 上提出另一个问题,但如果我的回答解决了你的问题,请务必点击旁边的复选框接受它。 - Justin Breitfeller
1
一个使用案例是:我有一个带有操作的通知。通常情况下,当用户选择操作时,它会在后台的服务中执行。然而有时需要显示一个警告对话框。 - Mark Gjøl
1
在通知中由按钮按下启动活动是可以的。但是,这也不同于从服务显示对话框。 - Justin Breitfeller
这实际上并没有回答问题。 - Vladyslav Matviienko
答案是:不要这样做。如果你一定要这么做,那就创建一个主题为对话框的活动。不要试图把对话框类塞进服务中,因为这样注定会失败。 - Justin Breitfeller
显示剩余3条评论

4

您可以先学习如何创建一个看起来像对话框的活动(没有标题栏、透明背景、"浮动"效果等),但是不能仅仅启动一个对话框而没有活动。


1

不,你不能劫持不属于你的活动并命令它显示对话框。 你自己启动活动的方法是经典的。


1

你不能显示对话框。但是,你可以通过填充自定义视图的方式来采用替代方法,以便在满足某些条件时在屏幕上显示对话框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接