在Service里调用AlertDialog

用常规的方法在AlertDialog的时候,会报错,大意是「can not add window in this view」。

原因是Service是没有界面的,只有Activity才能添加界面。

解决方法是使用系统的dialog,即全局性质的提示框。这个Dialog可能不只局限于Service里可以使用,而是在任何位置都可以悬浮。

具体可以模仿如下代码:

Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("提示");
    builder.setMessage("该下车了");
    builder.setNegativeButton("取消", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    builder.setPositiveButton("确定", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    final AlertDialog dialog = builder.create();
    **//在dialog  show方法之前添加如下代码,表示该dialog是一个系统的dialog**
    dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
    new Thread(){
        public void run() {
            SystemClock.sleep(4000);
            hanlder.post(new Runnable() {
                @Override
                public void run() {
                    dialog.show();
                }
            });
            };
    }.start();
}

讨厌的一点是要加一个权限:

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

 

另外,在Listener的匿名内部类中使用一个non-final的变量'msg'时,它提示了「Cannot refer to a non-final variable msg inside an inner class defined in a different method"。」但是在函数声明过程中加入final(public void handleMessage(final Message msg))好像是不行的,会报错。我加了一个中间语句:

final File msg1 = (File)msg.obj;

然后再使用msg1,就可以了。

 

解决问题的过程中还遇到了handler,final(《重载、覆写和继承》),以及super之类的知识,要学习handler。

参考:http://my.eoe.cn/cainiao1/archive/2345.html?f_section=similar

posted @ 2014-02-27 10:50  LarryLawrence  阅读(654)  评论(0编辑  收藏  举报