`
webcenterol
  • 浏览: 915822 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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

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

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


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

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

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


Seivece中代码


创建了一个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 楼 lwangivy 2012-07-26  
代码里的那个d就是什么类型?

相关推荐

Global site tag (gtag.js) - Google Analytics