在某些环境下我们需要接收后台服务器的临时消息,需要显示在任何界面上层,这就有了全局显示对话框。
一、本文章只是简单地实现了在任何应用界面都可以显示的一个对话框,在最后附上DEMO
二、效果图
三、接下来就是代码部分了,贴主要部分代码
主页代码示例:
public class MainActivity extends AppCompatActivity {
private Button mOnClickIntnet;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onStart() {
super.onStart();
//兼容api23版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(MainActivity.this)) {
Intent intent = new Intent(MainActivity.this, GlobalService.class);
startService(intent);
} else {
//若没有权限,提示获取.
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
Toast.makeText(MainActivity.this, "需要取得权限以使用悬浮窗", Toast.LENGTH_SHORT).show();
startActivity(intent);
}
} else {
//SDK在23以下,不用管.
Intent intent = new Intent(MainActivity.this, GlobalService.class);
startService(intent);
finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mOnClickIntnet = (Button) findViewById(R.id.onClick_intnet);
mOnClickIntnet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent in = new Intent(MainActivity.this, AllDilaog_Activty.class);
startActivity(in);
}
});
}
public void onClick(View view) {
MyApp.showDialog("主页面我是全局弹窗");//调用全局对话框
}
服务中做处理代码示例:
public class GlobalService extends Service implements Observer {
private Dialog mDialog;
private ScheduledExecutorService mScheduledExecutorService;
private Handler mHandler = new Handler() {
public void dispatchMessage(android.os.Message msg) {
if (mDialog != null && !mDialog.isShowing()) {
mDialog.show();
}
}
;
};
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//下面的代码如果开放,就可以测试全局弹dialog功能。是每5秒弹一次。
// if (mDialog == null) {
// mDialog = new Dialog(getApplicationContext());
// mDialog.setContentView(R.layout.show_dialog);
// // 加入系统服务
// mDialog.getWindow().setType(
// (WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
// mScheduledExecutorService = Executors
// .newSingleThreadScheduledExecutor();
// mScheduledExecutorService.scheduleAtFixedRate(new Runnable() {
//
// @Override
// public void run() {
// // 5秒显示一次对话框
// mHandler.sendEmptyMessage(0);
// }
// }, 5, 5, TimeUnit.SECONDS);
//
// }
return super.onStartCommand(intent, flags, startId);
}
@Override
public void update(Observable observable, Object data) {
String msg = (String) data;
if (msg != null) {
if (mDialog == null) {
mDialog = new Dialog(MyApp.getmContext());
mDialog.setContentView(R.layout.show_dialog);
}
if (mDialog != null && !mDialog.isShowing()) {
mDialog.setTitle(msg);
// 加入系统服务
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0
// mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
// } else {
// mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
// }
//8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用TYPE_APPLICATION_OVERLAY
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
}else {
mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
}
mDialog.show();
}
} else {
if (mDialog != null) {
mDialog.cancel();
mDialog = null;
}
}
}
Application中代码示例:
public class MyApp extends Application {
private static Context mContext;
private static DialogObservable dialogObservable;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
dialogObservable = new DialogObservable();
dialogObservable.addObserver(new GlobalService());
}
public static Context getmContext() {
return mContext;
}
public static void showDialog(String msg) {
dialogObservable.showDialog(msg);
}
如需要完整代码,下载demo:戳这里下载
CSDN: 下载