项目开发有一个需求要用到全局dialog,即不依赖activity,何时都可以弹出dialog。整理了一下有两种方法,一种是开启一个service,在上面建dialog,另一种是利用windowManager来显示dialog。
无论哪种方式多需要先设定权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
下面介绍两种方式:
一、service方式
使用观察者模式,观察者更新显示内容,做为被观察者的service更新dialog。
有关观察者的介绍这里看一下这篇生动的文章:全手机弹出的dialog和观察者设计模式
下面是观察者:
/**
* 观察者,通知dialog更新
* Created by young2 on 2016/1/2.
*/
public class DialogObservable extends Observable{
public void showDialog(String msg){
setChanged();
notifyObservers(msg);
}
}
这里是被观察者:
mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
这句代表dialog是全局dialog,要在show之前设置。
/**
* 被观察者,更新dialog
* Created by young2 on 2016/1/2.
*/
public class GlobalDialogService extends Service implements Observer {
private Dialog mDialog;
@Override
public void update(Observable observable, Object data) {
String msg=(String) data;
if(msg!=null){
if (mDialog == null) {
mDialog = new Dialog(UMApplication.getContext());
mDialog.setContentView(R.layout.xq_progress_dialog_simple);
}
if (mDialog != null && !mDialog.isShowing()) {
mDialog.setTitle(msg);
// 加入系统服务
mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
mDialog.show();
}
}else {
if(mDialog!=null){
mDialog.cancel();
mDialog=null;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
然后我们新建一个application类,在这里添加dialog的单例
public class UMApplication extends Application{
private static Context mContext;
private static DialogObservable mDialogObservable;
@Override
public void onCreate() {
mContext=getApplicationContext();
mDialogObservable=new DialogObservable();//新建被观察者
mDialogObservable.addObserver(new GlobalDialogService());//添加观察者
super.onCreate();
}
public static Context getContext(){
return mContext;
}
public static void showDialog(String msg){
mDialogObservable.showDialog(msg);
}
}
这样子,就可以随时使用了。
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UMApplication.showDialog("显示的内容");
}
});
二、WindowManager方式
代码很简单,如下:
/**
* Created by young2 on 2016/1/14.
*/
public class GlobalDialog {
private static void showDialog(){
final WindowManager wm = (WindowManager) UMApplication.getContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams para = new WindowManager.LayoutParams();
para.height = -1;
para.width = -1;
para.format = 1;
para.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
para.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
final View mView = LayoutInflater.from(UMApplication.getContext()).inflate(
R.layout.xq_progress_dialog_simple, null);
wm.addView(mView, para);
}
}
这里
是显示,如果要取消显示,调用wm.
removeView(mView);就可以了。
注意,由于有些手机(如小米)限制了悬浮窗口功能,默认不能显示,需要进入 系统设置->其他应用管理, 找到你的应用,进入应用详情,启用悬浮窗功能。开启这个功能之后才能显示。