添加普通窗口
btn.setOnClickListener(new View.OnClickListener() {
//创建要显示的View
final TextView tv = new TextView(BezierViewActivity.this);
tv.setBackgroundColor(Color.WHITE);
tv.setText("子窗口");
//同一个acitiviy下的token都是相同的,所以这里直接用v的就可以
IBinder token = v.getWindowToken();
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
//指定窗口类型
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
params.token = token;
//获取windowmanager
final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
//调用addview方法就可以显示view
wm.addView(tv,params);
//设置键盘监听,否则是监听不到back键的
tv.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
wm.removeView(tv);
}
return false;
}
});
}
添加系统窗口
系统窗口比较特殊需要权限,因为系统窗口是可以在系统任何界面显示的
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
final Button hook = new Button(getApplicationContext());
hook.setText("hello window");
WindowManager.LayoutParams params = new WindowManager.LayoutParams(150,100,WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING,
PixelFormat.RGBX_8888);
params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
params.setTitle("title");
//这里为什么要new 一个新binder呢,是因为如果用父窗口的token,那么当父窗口隐藏了
//它的子窗口也会隐藏,而在wms内部会判断如果一个token没有父窗口,才会把该窗口的层值调到屏幕最上方,让他显示出来
params.token = new Binder();
final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(hook,params);
hook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wm.removeView(hook);
}
});
其实普通窗口和系统窗口的区别就是一个是在当前activity显示的,一个是在系统中任何界面都一直显示的,创建他们的区别也主要是token的区别.