Service如何弹出dialog

我们都知道service是没有界面的,默默的在后台执行逻辑代码,有时候需要和前台有所交互,如:toast或弹出提示框等等

service中弹出toast很简单,只要使用handler就可搞定,代码如下


hanlder.post(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(DialogService.this, "启动服务", 1).show();
     }
    });

而在 service 中弹出dialog时,如果写和activity同样的代码时会报错

因为这个dialog的显示是需要依附于一个activity,如果需要在servcie中显示需要把dialog设置成一个系统的dialog,即全局 性质的提示框,所以只要手机处于开机状态,无论它现在处于何种界面之下,只要调用alter.show(),就会弹出提示框来。需要在show() 调用之前添加以下代码:
dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));

注意:使用系统的Dialog需要在清单文件中添加权限,否则不会显示出来
Android.permission.SYSTEM_ALERT_WINDOW

全部代码

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();  
}  

猜你喜欢

转载自blog.csdn.net/tectrol/article/details/78763605