转自: https://blog.csdn.net/u014203484/article/details/78233980?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2

1.配置权限 :

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.权限判断和申请

PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED ==
        pm.checkPermission("Settings.ACTION_MANAGE_OVERLAY_PERMISSION", getPackageName()));
if (!permission) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 100);

3.自己定义一个view,继承自ViewGroup

public class MyView extends RelativeLayout {
    private static final String TAG = "CardListActivity";
    WindowManager wManager;
    public MyView(Context context, WindowManager wManager) {
        super(context);
        this.wManager = wManager;
//        init(context);
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
//        init(context);
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
//        init(context);
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
       //响应退出键,只隐藏弹出框,截获返回键,避免退出下面的页面
        if(KeyEvent.ACTION_UP==event.getAction()&&event.getKeyCode()==KeyEvent.KEYCODE_BACK){
            wManager.removeView(this);//移除窗口    }
            return true;
        }else {
            return super.dispatchKeyEvent(event);

4.定义添加弹窗的方法

private WindowManager wManager;// 窗口管理者
private WindowManager.LayoutParams mParams;// 窗口的属性
private MyView myView;
private void showAlertWindow() {
    PackageManager pm = getPackageManager();
    boolean permission = (PackageManager.PERMISSION_GRANTED ==
            pm.checkPermission("Settings.ACTION_MANAGE_OVERLAY_PERMISSION", getPackageName()));
    if (!permission) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 100);
    wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    mParams = new WindowManager.LayoutParams();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 系统提示window
    mParams.format = PixelFormat.TRANSLUCENT;// 支持透明
    //mParams.format = PixelFormat.RGBA_8888;
    //mParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 焦点
    mParams.width = 490;//窗口的宽和高
    mParams.height = 160;
    mParams.x = 0;//窗口位置的偏移量
    mParams.y = 0;
    //mParams.alpha = 0.1f;//窗口的透明度
    myView = new MyView(this, wManager);
    TextView tx = new TextView(context);
    ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(200, 300);
    tx.setLayoutParams(layoutParams);
    tx.setBackgroundColor(R.color.learningCardBackRed);
    tx.requestFocus();
    tx.setText("agesttwaakdfja;dkfjaldfkjaldfjadkf");
    myView.addView(tx);
    myView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (view.equals(myView)) {
                if (myView.getParent() != null)
                    wManager.removeView(myView);//移除窗口    }  }
    wManager.addView(myView, mParams);
                                    要在Android中实现顶层的窗口弹出,一般都会用WindowsManager来实现,但是几乎所有的网站资源都是说弹出的悬浮窗不用接受任何按键响应。
而问题就是,我们有时候需要他响应按键,比如电视上的android,我们要它响应遥控器上的音量按键等等之类的。这时就必须要对添加的View进行LayoutParams的相关设置了。
主要的代码就两个地方。
第一,添加的view不可以设置layou...
                                    上一次由于项目的需要,需要在app级屏蔽home键,返回键等键所在一栏。百度各种无结果。于是就自己研究了一翻。发现了两种可行的方法:
方法一:用全屏悬浮窗去掉home键,返回键等键所在一栏
代码如下(直接做一个类全部复制进去即可,不用修改):
package com.xchy.utils;
import android.app.Activity;
import android.a
                                    显示悬浮,注意一定不要设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,拿不到Focus是接收不到back事件的。
private void showPreviewDialog(){
    View mPreviewLayout = LayoutInflater.from(getContext()).inflate(R.layout.window_preview,null);
    WindowManager.LayoutParams layoutPara
                                    部分代码如下:public void ShowAlertScreen(Context context,String titles,String content,String phone){// 获取Servicewm = (WindowManager) context.getSystemService("window");WindowManager.LayoutParams mWindowPara...
                                    解决通过WindowManager添加的View无法响应返回按键
最近在测试是否能够在子线程中操作UI问题时,发现通过WindowManager的addView(View view, ViewGroup.LayoutParams params)方法在当前线程添加一个View后,点击物理返回按键没有反应。代码如下:
public void addViewByWM(Context context) {
	View rootView = LayoutInflater.from(context).inflate(R
                                    今天在做公司的广告sdk的启动页广告的时候,使用windowmanager来显示一个view在最上层,之前都是定时消失的,后来无意中发现按返回按钮都没有消失,于是开始找解决方法。
          首先想起心里天气通有类试的功能,于是反编译看其代码,里面实现的方式是 setOnKeyListener()把自己的监听器传递进去来处理,这个方法也是最容易想到的,其是可以解决部分情况,如当addvi
                                    这篇博客只是一个demo,记录一种思想,采用windowmanager屏蔽home键,因为采用activity貌似行不通,后来了解了windowmanager之后才明白,记录一下。
//这里只是一个按钮,点击启动一个service
public class MainActivity extends Activity {
    private Button btn_lock
                                    在Android开发时,有时因为需求,需要跳转到系统的一些页面,比如从UI中跳转到系统设置项、WIFI设置等,那要如何返回到原来的Activity中呢?
我们可以通过WindowManager来实现。原理可以简单的理解为在跳转到系统的Activity中后,在该Activity的上方添加一个按钮,然后对这个按钮添加事件。
先看看效果图
应用Window,对应Activity,层级范围是 1~99
子Window,对应Dialog和PopupWindow,层级范围是 1000~1999
系统Window,对应Toast层级范围是 2000~2999
WindowManager继承ViewManager,可以显示类似悬浮窗效果,...