WindowManager.LayoutParams:
int TYPE_SYSTEM_ALERT Window type: system window, such as low power alert.(系統窗體,例如低電量警告提示框)
int TYPE_SYSTEM_OVERLAY Window type: system overlay windows, which need to be displayed on top of everything else.(系統覆蓋窗體,哪個需要顯示在最前的)
TYPE_SYSTEM_ALERT跟TYPE_SYSTEM_OVERLAY的區別
system_alert窗口可以獲得焦點,響應操作
system_overlay窗口顯示的時候焦點在后面的Activity上,仍舊可以操作后面的Activity
清單文件manifest中需要相應的permission
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
以下兩種方式顯示出來的窗口都不會激發當前Activity的onPause()事件。
1. Seivece 創建窗體
1 private void showSystemDialog() { 2 /* create ui dialog */ 3 View v = View.inflate(mContext, R.layout.serveice_dialog, null); 4 AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 5 alertDialog.setView(v); 6 dialog = alertDialog.create(); 7 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 8 //dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); 9 dialog.show(); 10 **** 注意dialog 在執行show方法之后,才能調整dialog的大小以及更新數據 **** 11 /* set size & pos */ 12 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); 13 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 14 Display display = wm.getDefaultDisplay(); 15 if (display.getHeight() > display.getWidth()) { 16 //lp.height = (int) (display.getHeight() * 0.5); 17 lp.width = (int) (display.getWidth() * 1.0); 18 } else { 19 //lp.height = (int) (display.getHeight() * 0.75); 20 lp.width = (int) (display.getWidth() * 0.5); 21 } 22 d.getWindow().setAttributes(lp); 23 24 /* update ui data */ 25 lv = (ListView) d.getWindow().findViewById(R.id.listview); 26 SimpleAdapter adapter = new SimpleAdapter(mContext, getListData(), R.layout.list_item, 27 new String[]{"item_text", "item_img"}, 28 new int[]{R.id.item_text, R.id.item_img}); 29 lv.setAdapter(adapter); 30 31 /* set listener */ 32 lv.setOnItemClickListener(new OnItemClickListener() { 33 public void onItemClick(AdapterView<?> parent, View view, int pos, 34 long id) { 35 d.dismiss(); 36 } 37 }); 38 39 }
2. 直接使用WindowManager.addView()在后台直接顯示窗口
1 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 2 mDesktopLayout = inflater.inflate(R.layout.volume_panel, null); 3 // 取得系統窗體 4 mWindowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE); 5 // 窗體的布局樣式 6 mLayoutParams = new WindowManager.LayoutParams(); 7 // 設置窗體顯示類型――TYPE_SYSTEM_ALERT(系統提示) 8 mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 9 // 設置窗體焦點及觸摸: 10 // FLAG_NOT_FOCUSABLE(不能獲得按鍵輸入焦點) 11 mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 12 // 設置顯示的模式 13 mLayoutParams.format = PixelFormat.RGBA_8888; 14 // 設置對齊的方法 15 mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT; 16 // 設置窗體寬度和高度 17 mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 18 mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 19 // 設置窗體顯示的位置,否則在屏幕中心顯示 20 mLayoutParams.x = 50; 21 mLayoutParams.y = 50; 22 mWindowManager.addView(mDesktopLayout, mLayoutParams);
