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);
时间: 2024-10-13 01:04:22

Android: Service中创建窗口显示的相关文章

在Android Studio中创建项目和模拟器

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________  指导老师:娄嘉鹏   实验日期 :2015.11.1 实验名称:           在Android Studio中创建项目和模拟器 实验内容:       1.在Android Studio中创建项目 2.创建并启动Android模拟器 一.实验简介 熟悉Android的开发环境.一些基本的操作技巧以及调试技

Android实验一(在Android Studio中创建项目和模拟器)

北京电子科技学院(BESTI) 实     验    报     告 课程:移动平台开发         班级:1592 姓名:苏泽楠 学号:20159207 成绩:             指导教师:娄嘉鹏       实验日期:2015.10.31 实验密级:         预习程度:             实验时间:15:30-16:30 仪器组次:          必修/选修:选修        实验序号: 实验名称:在Android Studio中创建项目和模拟器 实验仪器: 名

Android studio 中创建AIDL Service

  1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.最近看了下AIDL在Android系统中的用法,在网上看到很多初学的朋友不太明白AIDL的实际作用,android提供了很多进程间通信的组件,像action.broadcast.contentprovide都可以实现进程间的通信,为什么还要用AIDL这个东西呢?我在a

android Service中多线程交互

android 的service和activity是执行在UI主线程的. 在android线程中,仅仅有主线程即UI线程有自己的默认的消息队列.子线程须要创建自己的消息队列.并把消息发给队列,并循环起来,发给handler处理. 1.Looper.prepare();给子线程创建消息队列. 2.Looper.loop();把消息放入消息队列并循环起来. 例如以下是一个通过activity的oncreate()方法启动服务,在服务里开启子线程,并发消息给主线程来处理的DEMO. 3.MainAct

隐藏windows任务栏中的窗口显示

在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不同应用程序中切换. 考虑到windows操作系统是基于shell的,查找shell的接口资料会发现 ITaskbarList interface .ITaskbarList提供了AddTab和DeleteTab函数,用于向任务栏中添加删除窗口项. 第一种方法就是使用ITaskbarList接口,在程

android Service中启动Dialog

        在Service 中弹出Dialog与在Activity中弹出Dialog的方式一样,可是activity finish后,dialog也会随着关闭.他是依附着activity的.在Service中就不一样了,Service没有界面,言弹出Dialog.他依附什么呢? 首先,看看在Service中怎样弹出对话框: dialog = new AlertDialog.Builder(ctx).create(); dialog.getWindow().setType(WindowMan

在Android Studio中创建(或添加)第一个Hello World应用程序

下面我们将使用Android Studio创建第第一个简单的Hello World应用程序. 1.打开Android Studio,加载画面如下图所示: 2.选择"Start a new Android Studio project",如下图所示: 3.输入应用程序名.选择项目路径,然后点击"Next",如下图所示: 4.选择最小版本的SDK,然后点击"Next",如下图所示: 5.选择"Blank Activity",然后选

如何控制android系统中NavigationBar 的显示与隐藏

我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键.如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在屏幕的下方加了一个小黑条,在这个黑条上有3个按钮控件,这种设置无疑使得手机的外观的设计更加简约.但我遇到身边用Nexus 4手机的人都吐槽这种设计,原因很简单:好端端的屏幕,被划出一块区域用来显示3个按钮(如下图所示):Back, Home, Recent.并且它一直用在那里占用着. 在androi

Android Service 中 onStartCommand()函数返回值含义

onStartCommand()是由Android系统调用的,本质上也是调用了onStart()方法. onStartCommand()返回值有几种: 1)START_STICKY 英文解释: Constant to return from onStartCommand: if this service's process is killed while it is started (after returning from onStartCommand), then leave it in t