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); }