android 6.0 全局提示框,类似网吧包时结束时上方提示框
1.创建WindowManager
private static boolean isShow = true;
private static WindowManager windowManager = null;
private static MyMarqueeView marqueeView = null;
private static WindowManager.LayoutParams params = null;
private void createTipWindow() {
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
//获取窗口布局参数实例
params = new WindowManager.LayoutParams();
//设置窗口布局参数属性
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = 120;
//设置window的显示特性
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
//设置窗口半透明
params.format = PixelFormat.TRANSLUCENT;
params.gravity = Gravity.TOP;
//设置窗口类型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
marqueeView = new MyMarqueeView(this);
marqueeView.setBackgroundColor(getResources().getColor(R.color.yellow));
}
2.正常展示提示框
public void showTipWindow() {
String timeStamp = PropertiesUtil.getTimeStamp(VLCApplication.getAppContext().getResources().getString(R.string.time_stamp));
long currentT = System.currentTimeMillis();
if (timeStamp != null && Long.decode(timeStamp) > 0) {
Long surplusTime = Long.decode(timeStamp) - currentT;
int surC = (int) (surplusTime / 60000);
if (isShow && surC > 0) {
isShow = false;
if (!Settings.canDrawOverlays(VLCApplication.getAppContext()))
return;
marqueeView.setContent("距离包时结束还剩下" + surC + "分钟");
windowManager.addView(marqueeView, params);
}
}
}
3.销毁提示框
这里很容易发生错误 java.lang.IllegalArgumentException: View not attached to window manager
网上很多案例说是不让使用removeView方法
,换成使用windowManager.removeViewImmediate(view);
然并卵。
public void hideTipWindow() {
try {
if (!isShow && marqueeView != null) {
windowManager.removeView(marqueeView);
isShow = true;
}
}catch (Exception e){
e.printStackTrace();
}
}
我是把它放在service里面去创建,没有依附于activity,使用正常。
哦,对了,添加权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
不能少了它。
然后在程序启动时去申请权限
private void requestAlertWindowPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
在展示之前加判断 if (! Settings.canDrawOverlays(this))
以免没有权限报错。
可能有人会问 MyMarqueeView 这个是什么东西,这个是继承textview做的一个自动横向滚动提示语的一个view,如有需要,可留言告诉我哦。
到这里系统提示框已经可以正常使用了,如果本文对你有一丢丢帮助。请帮忙点个赞,谢谢啦。