android 6.0 全局提示框,类似网吧包时结束时上方提示框

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,如有需要,可留言告诉我哦。
到这里系统提示框已经可以正常使用了,如果本文对你有一丢丢帮助。请帮忙点个赞,谢谢啦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值