Android: Service中创建窗口显示(TYPE_SYSTEM_ALERT, TYPE_SYSTEM_OVERLAY)

分类:Android 164人阅读 评论(0) 收藏 举报

有时候需要在显示UI的时候不中断原来的Activity

比如在播放视频时或者玩游戏时,需要显示某个菜单(可以是系统提示,或类似于TV菜单)

显然用Activity来做是不行的,因为新Activity启动的时候会把原来的Activity pause掉

怎么做呢,可以参考系统电量提示窗口或statusbar那样在service中启动窗口

新窗口将会出现在UI最上层,但不会中断原来的Activity

效果图,一个是播视频中,一个是玩游戏中:


看一下WindowManager.LayoutParams的两个属性:

intTYPE_SYSTEM_ALERT Window type: system window, such as low power alert.
intTYPE_SYSTEM_OVERLAYWindow type: system overlay windows, which need to be displayed on top of everything else.

这两个不错,正是我们想要的,上代码~


Seivece中代码

view plain
  1. privatevoidshowSystemDialog(){
  2. /*createui*/
  3. Viewv=View.inflate(mContext,R.layout.main,null);
  4. AlertDialog.Builderb=newAlertDialog.Builder(mContext);
  5. b.setView(v);
  6. d=b.create();
  7. d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  8. //d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  9. d.show();
  10. /*setsize&pos*/
  11. WindowManager.LayoutParamslp=d.getWindow().getAttributes();
  12. WindowManagerwm=(WindowManager)getSystemService(WINDOW_SERVICE);
  13. Displaydisplay=wm.getDefaultDisplay();
  14. if(display.getHeight()>display.getWidth()){
  15. //lp.height=(int)(display.getHeight()*0.5);
  16. lp.width=(int)(display.getWidth()*1.0);
  17. }else{
  18. //lp.height=(int)(display.getHeight()*0.75);
  19. lp.width=(int)(display.getWidth()*0.5);
  20. }
  21. d.getWindow().setAttributes(lp);
  22. /*updateuidata*/
  23. lv=(ListView)d.getWindow().findViewById(R.id.listview);
  24. SimpleAdapteradapter=newSimpleAdapter(mContext,getListData(),R.layout.list_item,
  25. newString[]{"item_text","item_img"},
  26. newint[]{R.id.item_text,R.id.item_img});
  27. lv.setAdapter(adapter);
  28. /*setlistener*/
  29. lv.setOnItemClickListener(newOnItemClickListener(){
  30. publicvoidonItemClick(AdapterView<?>parent,Viewview,intpos,
  31. longid){
  32. d.dismiss();
  33. }
  34. });
  35. }

创建了一个dialog,可以调整dialog的位置、大小,dialog的从R.layout.main创建,动态添加UI数据

响应Ui上的OnClick操作


* manifest中需要相应的permission

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

*TYPE_SYSTEM_ALERT跟TYPE_SYSTEM_OVERLAY的区别

以上面的代码为例,system_alert窗口可以获得焦点,响应操作

system_overlay窗口显示的时候焦点在后面的Activity上,仍旧可以操作后面的Activity

* 上面的代码中请留意d.show()的位置,只有在show之后才能调整dialog大小及更新数据

* 可以调整的Attributes,先dump出来

lp.flags = 0x20002, //FLAG_DIM_BEHIND | FLAG_ALT_FOCUSABLE_IM

lp.gravity = 0x11, // CENTER

lp.type= 0x7d3, //TYPE_SYSTEM_ALERT

这些Attr都可以设置,具体定义在API文档WindowManager.LayoutParams中

更多相关文章

  1. Android(安卓)利用ScaleDrawable实现缩放
  2. 【移动安全高级篇】————7、APK 的自我保护
  3. Android开发环境配置简介
  4. android application
  5. 在Ubuntu16.04上下载并编译Android内核源代码
  6. android 中使用java aes加密算法,报错信息android javax.crypto.B
  7. Android,开源还是封闭?
  8. Android(安卓)SystemUI (导入到Eclipse,可以正常运行)
  9. android主流UI布局

随机推荐

  1. Android多分辨率适配
  2. Android源码笔记--Activity的启动过程
  3. 图解Android源代码下载指南
  4. android文档开发规范
  5. android 多任务多线程断点下载
  6. 听说”双11”是这么解决线上bug的
  7. Android中的Service初探
  8. Opera Mobile 在 Android x86 上运作流畅
  9. cocos2dx在windows下开发,编译到android上
  10. Andriod 单元测试 Test run failed:Unabl