AlertDialog.show在服务中默默忽略

时间:2010-11-09 08:17:12

标签: android multithreading service dialog

我有一个运行后台线程的服务。我想做的是 显示从我的后台线程启动的AlertDialog。我知道 这不是通知用户及其的推荐方式 中断工作流程(因为它们可以在任何应用程序中弹出) 时间)但这是我用例的合适方式。

在后台线程中注册了一个处理程序并显示了一个 使用处理程序的Toast通知正常工作。但转换后 一个AlertDialog不再发生任何事情。我的showDialog逻辑是 默默地忽略了。没有对话窗口,没有日志条目。这有点儿 奇怪的是,我希望至少有一个日志条目说我正在做 错误或其他什么。

显示从a启动的AlertDialog是否有任何限制 服务背景线程?有些人似乎推荐以Dialog为主题 获得类似行为的活动。

非常感谢任何澄清或帮助使其发挥作用!

伊夫

3 个答案:

答案 0 :(得分:1)

  

显示从服务后台线程启动的AlertDialog是否有任何限制?

限制是:AFAIK不可能。您必须显示主应用程序线程中的对话框,而不仅仅是您拥有Handler的任意线程。

  

有些人似乎建议使用Dialog主题活动来获得类似的行为。

这似乎是最有可能的解决方案,AFAICT。

答案 1 :(得分:1)

可以从后台线程打开一个对话框。诀窍是启动一个看起来像对话框的活动:

<activity android:label="@string/app_name" android:name="YourDialog" android:theme="@android:style/Theme.Dialog"/>

然后,开始您的活动:

Intent dialog = new Intent(this, YourDialog.class);
dialog.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialog);

请注意,这是异步的,不会阻止。如果要处理结果,则必须使用startService()并传递自定义活动以指示结果。

灵光

答案 2 :(得分:1)

另一个技巧是继续使用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" />