文档章节

Android Service中创建窗口显示

yaly
 yaly
发布于 2015/05/06 10:06
字数 493
阅读 2112
收藏 2

有时候需要在显示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中代码

private void showSystemDialog() {     
    /* create ui */   
        View v = View.inflate(mContext, R.layout.main, null);  
        AlertDialog.Builder b = new AlertDialog.Builder(mContext);  
        b.setView(v);  
        d = b.create();   
        d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);  
        //d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);  
    d.show();     
  
        /* set size & pos */  
        WindowManager.LayoutParams lp = d.getWindow().getAttributes();                
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);  
        Display display = wm.getDefaultDisplay();  
    if (display.getHeight() > display.getWidth()) {  
        //lp.height = (int) (display.getHeight() * 0.5);  
        lp.width = (int) (display.getWidth() * 1.0);          
    } else {  
        //lp.height = (int) (display.getHeight() * 0.75);  
        lp.width = (int) (display.getWidth() * 0.5);                  
    }  
        d.getWindow().setAttributes(lp);  
          
        /* update ui data */  
        lv = (ListView) d.getWindow().findViewById(R.id.listview);   
       SimpleAdapter adapter = new SimpleAdapter(mContext, getListData(), R.layout.list_item,                 
                            new String[]{"item_text", "item_img"},                
                            new int[]{R.id.item_text, R.id.item_img});   
        lv.setAdapter(adapter);           
          
        /* set listener */  
       lv.setOnItemClickListener(new OnItemClickListener() {  
        public void onItemClick(AdapterView<?> parent, View view, int pos,  
                long id) {  
            d.dismiss();    
        }  
       });       
      
}



创建了一个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中


本文转载自:http://blog.csdn.net/zmyde2010/article/details/6863717

yaly
粉丝 3
博文 101
码字总数 48443
作品 0
海淀
Android工程师
私信 提问
Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析

每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。与Activity组件所关联的窗口对象的实际类型为PhoneWindow。 那么创建...

lonamessi
2018/05/31
0
0
Android窗口机制(三)Window和WindowManager的创建与Activity

Android窗口机制系列 Android窗口机制(一)初识Android的窗口结构 Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解 Android窗口机制(三)Window和WindowMan...

亭子happy
02/26
0
0
Android: Service中创建窗口显示(TYPE_SYSTEM_ALERT, TYPE_SYSTEM_OVERLAY)

有时候需要在显示UI的时候不中断原来的Activity 比如在播放视频时或者玩游戏时,需要显示某个菜单(可以是系统提示,或类似于TV菜单) 显然用Activity来做是不行的,因为新Activity启动的时候会...

长平狐
2012/06/20
2.2K
0
Android窗口机制(五)最终章:WindowManager.LayoutParams和Token以及其他窗口Dialog,Toast

Android窗口机制系列 Android窗口机制(一)初识Android的窗口结构 Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解 Android窗口机制(三)Window和WindowMan...

亭子happy
02/26
0
0
Android 下自定义Toast

自定义Toast中用到了windowManager这个类 一下为简单介绍: 应用程序与窗口管理器的接口。WindowManager是Android中一个重要的服务。WindowManager Service是全局唯一的。它将用户的操作,翻...

Angels_安杰
2015/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

解决vim打开之后乱码的问题

在Windows中的文档,传输到Linux系统中(使用rz命令),出现乱码 root@localhost ~]# rpm -qf `which iconv` glibc-common-2.17-105.el7.x86_64 [root@localhost ~]# rpm -ihv /mnt/Packages......

寰宇01
33分钟前
1
0
aldi 2017年1月记录

../../tools/CBLAS/lib/cblas_LINUX.a ../../tools/lapack-3.4.2/liblapacke.a \../../tools/lapack-3.4.2/librefblas.a -lgfortran \../../tools/lapack-3.4.2/liblapack.a \../../......

MtrS
34分钟前
2
0
Choerodon如何进行日志收集与告警

作者:董文启 应用程序日志是由软件应用程序记录的事件文件, 它一般包含错误,信息事件和警告。一个良好的日志系统有助于快速发现问题,定位问题,同时也为业务分析起到一定的作用。 传统E...

Choerodon
46分钟前
2
0
js二维码生成插件“jquery.qrcode.min.js”

<!doctype html> <html> <head> <meta charset="utf-8" /> <title>生成二维码</title> <script type='text/javascript' src='http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'></scri......

泉天下
49分钟前
1
0
Spring AOP之同一个对象方法内部自调用导致事务失效问题

对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,SpringAOP,就切入不...

xiaomin0322
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部