如何在服务类中的Timer内显示AlertDialog?

时间:2011-03-14 07:48:29

标签: android

我想在Service类的Timer中显示AlertDialog,我正在使用以下代码:

timer.scheduleAtFixedRate( new TimerTask() 
{
    private Handler updateUI = new Handler()
    {
        public void dispatchMessage(android.os.Message msg)
        {
            super.dispatchMessage(msg);
            try {                       
                fun();
            } catch (Exception e) {e.printStackTrace(); }    
        }
    };
    public void run() 
    { 
        try {
            updateUI.sendEmptyMessage(0);                   
        }catch (Exception e) {e.printStackTrace(); }
    }
}, 0,60000);

public void fun()
{
    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);                      
    dlgAlert.setMessage("");
    dlgAlert.setTitle("");              
    dlgAlert.setPositiveButton("OK", null);
    dlgAlert.setCancelable(true);
    dlgAlert.create();
    dlgAlert.show();
}

我收到了以下错误:

03-14 13:14:36.879: WARN/WindowManager(60): Attempted to add window with non-application token WindowToken{43f606b0 token=null}.  Aborting.
03-14 13:14:36.879: WARN/System.err(817): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
03-14 13:14:36.889: WARN/System.err(817):     at android.view.ViewRoot.setView(ViewRoot.java:509)
03-14 13:14:36.889: WARN/System.err(817):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-14 13:14:36.889: WARN/System.err(817):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-14 13:14:36.899: WARN/System.err(817):     at android.app.Dialog.show(Dialog.java:241)
03-14 13:14:36.899: WARN/System.err(817):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
03-14 13:14:36.899: WARN/System.err(817):     at com.mobilelocalite.pkg.GPSServiceCellId.comparefromDb(GPSServiceCellId.java:373)
03-14 13:14:36.909: WARN/System.err(817):     at com.mobilelocalite.pkg.GPSServiceCellId$1$1.dispatchMessage(GPSServiceCellId.java:133)
03-14 13:14:36.909: WARN/System.err(817):     at android.os.Looper.loop(Looper.java:123)
03-14 13:14:36.909: WARN/System.err(817):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-14 13:14:36.909: WARN/System.err(817):     at java.lang.reflect.Method.invokeNative(Native Method)
03-14 13:14:36.909: WARN/System.err(817):     at java.lang.reflect.Method.invoke(Method.java:521)
03-14 13:14:36.909: WARN/System.err(817):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-14 13:14:36.920: WARN/System.err(817):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-14 13:14:36.920: WARN/System.err(817):     at dalvik.system.NativeStart.main(Native Method)

先谢谢。

3 个答案:

答案 0 :(得分:1)

看看这个问题:Alert dialog from Android service

编辑:

问题是你试图在没有任何窗口引用的情况下弹出对话框。您需要将消息发送到Activity并让Activity处理弹出的对话框。

使用

new AlertDialog.Builder(this);
服务中的

会给你一个类似于你得到的错误。在Activity中使用相同的代码不会。

因此,另一种方法是向您正在联系的活动发送广播,让活动收听此广播。当活动收到广播时,会显示一个对话框。

答案 1 :(得分:0)

 Attempted to add window with non-application token WindowToken{43f606b0 token=null}.  Aborting.

你得到这个是因为你试图在服务中添加一个没有渲染线程来绘制任何东西的窗口。无论何时你试图添加一个对话框,它首先从系统中获取一个父窗口的标记,即系统对话框的“上下文”。你在上下文中传递“this”,在你的情况下是服务。这是不正确的。

您应该尝试使用ApplicationContext或某些Activity的上下文。

答案 2 :(得分:0)

最好的方法是创建一个将从DialogFragment(android.support.v4.app.DialogFragment)继承的类。 See android Doc

您可以通过以下方式致电DialogFragment

 DialogFragment fragment;
 FragmentManager fm = activity.getSupportFragmentManager();
            final FragmentTransaction transaction = fm.beginTransaction();

            fragment.show(transaction, "dialog");
            if (addToBackStack) {
                transaction.addToBackStack(null);
            } else {
                clearBackStack(activity);

希望有帮助