Android: Service中創建窗口顯示


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM