android 窗口类型分为三类:
1,第一种为应用窗口。所谓的应用窗口一般是指该窗口对应一个Activity,由于加载Activity是由AmS完成的,因此,对于应用程序来讲,要创建一个应用类窗口,只能 在Activity内部完成。
2,第二种是子窗口。所谓的子窗口是指,该窗口必须有一个父窗口,父窗口可以是一个应用类型窗口,也可以是任何其他类型的窗口。
3,第三种是系统窗口。系统窗口不需要对应任何Activity,也不需要有父窗口。对于应用程序而言,理论上是无法创建系统窗口,因为所有的
应用程序都没有这个权限,然而系统进程却可以创建系统窗口。
创建一个窗口
1,添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2,android code
1 public class WindowActivity extends AppCompatActivity { 2 3 private WindowManager wm; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_window); 9 wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 10 } 11 12 public void show(View view) { 13 final View views = LayoutInflater.from(this).inflate(R.layout.dialog_layout, null); 14 views.findViewById(R.id.cnacel).setOnClickListener(new View.OnClickListener() { 15 @Override 16 public void onClick(View v) { 17 wm.removeView(views); 18 } 19 }); 20 views.findViewById(R.id.sure).setOnClickListener(new View.OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 wm.removeView(views); 24 } 25 }); 26 IBinder token = view.getWindowToken(); 27 //WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,子窗口 28 WindowManager.LayoutParams lp = new WindowManager.LayoutParams( 29 WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT, 30 WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,//系统窗口跟activity没有关系,可以在任何activity上弹出来 31 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 32 | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, 33 PixelFormat.RGBX_8888 34 ); 35 36 lp.gravity = Gravity.CENTER_HORIZONTAL |Gravity.CENTER; 37 lp.token = token; 38 39 wm.addView(views,lp); 40 } 41 }
(小米手机测试时要打开悬浮框)